Nodoid
Nodoid

Reputation: 1571

Moving from standard .NET rest to RestSharp

For the most part, I have managed quite quickly to move my code from standard .NET code to using RestSharp. This has been simple enough for GET processes, but I'm stumped for POST processes

Consider the following

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\" : \"[email protected]\",\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();
}

This is fairly straight forward to move across, except for the serialisation code. Is there a particular way this has to be done for RestSharp? I've tried creating an object and using

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

but the server still comes back with an error.

I'm also currently using JSON.NET for deserialization to an error object when the user passes in bad data. Is there a way I can deserialize to error object based on a single string using RestSharp?

Upvotes: 2

Views: 2211

Answers (1)

gregmac
gregmac

Reputation: 25291

You're close, but you don't need to worry about serialization with RestSharp.

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

By telling it that the format is JSON, then passing your already-serialized-as-JSON string, RestSharp is actually encoding it again as a string.

So you pass the string: {"firstName":"foo"} and it actually gets sent to the server as a JSON string object: "{\"firstName\":\"foo\"}" (note how your JSON is escaped as a string literal), which is why it's failing.


Note you can also use an anonymous object for the request:

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

You use the same typed objects with the response (eg, RestSharp deserializes for you):

var response = client.Execute<UserResponse>(request);
// if successful, response.Data is of type UserResponse 

Upvotes: 7

Related Questions