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 回答