2

ほとんどの場合、コードを標準の .NET コードから RestSharp を使用するようにすばやく移行できました。これは GET プロセスでは十分に単純ですが、POST プロセスでは困惑しています。

次のことを考慮してください

var request = System.Net.WebRequest.Create("https://mytestserver.com/api/usr") as System.Net.HttpWebRequest;
request.Method = "POST";
request.ContentType = "application/json;version=1";
request.Headers.Add("Content-Type", "application/json;version=1");
request.Headers.Add("Accepts", "application/json;version=1");
request.Headers.Add("Authorize", "key {key}");
using (var writer = new System.IO.StreamWriter(request.GetRequestStream())) {
  byte[] byteArray = System.Text.Encoding.UTF8.GetBytes("{\n    \"firstName\": \"Dan\",\n    \"lastName\": \"Eccles\",\n    \"preferredNumber\": 1,\n    \"email\" : \"testuser@example.com\",\n    \"password\": \"you cant get the wood\"\n}");
  request.ContentLength = byteArray.Length;
  writer.Write(byteArray);
  writer.Close();
}
string responseContent;
using (var response = request.GetResponse() as System.Net.HttpWebResponse) {
using (var reader = new System.IO.StreamReader(response.GetResponseStream())) {
  responseContent = reader.ReadToEnd();
}

これは、シリアライゼーション コードを除いて、かなり簡単に移動できます。RestSharp でこれを行う必要がある特定の方法はありますか? オブジェクトを作成して使用しようとしました

var json = JsonConvert.SerializeObject(user);
restRequest.RequestFormat = DataFormat.Json;
restRequest.AddBody(json);

しかし、サーバーはまだエラーを返します。

また、現在、ユーザーが不正なデータを渡したときに、エラー オブジェクトへの逆シリアル化に JSON.NET を使用しています。RestSharp を使用して単一の文字列に基づいてエラー オブジェクトに逆シリアル化する方法はありますか?

4

1 に答える 1

7

近いですが、RestSharp を使用したシリアル化について心配する必要はありません。

var request = new RestRequest(...);
request.RequestFormat = DataFormat.Json;
request.AddBody(user);  // user is of type User (NOT string)

形式が JSON であることを伝え、既にシリアル化された JSON 文字列を渡すと、RestSharp は実際にそれをstring として再度エンコードします。

したがって、文字列: を渡す{"firstName":"foo"}と、実際にはJSON 文字列オブジェクトとしてサーバーに送信されます: "{\"firstName\":\"foo\"}"(JSON が文字列リテラルとしてエスケープされる方法に注意してください)。これが失敗の理由です。


リクエストに匿名オブジェクトを使用することもできます。

var request = new RestRequest(...);
request.RequestFormat = DataFormat.Json;
request.AddBody(new{ 
    firstName = "Dan",
    lastName = "Eccles",
    preferredNumber = 1,
    // etc..
  });

応答で同じ型指定されたオブジェクトを使用します (たとえば、RestSharp が逆シリアル化します)。

var response = client.Execute<UserResponse>(request);
// if successful, response.Data is of type UserResponse 
于 2013-07-16T21:32:04.500 に答える