RestSharp seems to not allow me to override the Content-Type for a post request. I've followed the directions found here to no avail. I've also tried manually setting the header content type to application/json via request.AddHeaders("content-type", "application/json");
Examples of the request execution:
private IRestResponse ExecuteRequest<T>(string resource, Method method, T model)
{
var client = CreateRestClient();
var request = new RestRequest(resource, method)
{
RequestFormat = DataFormat.Json
};
var json = JsonConvert.SerializeObject(model);
request.AddHeader("Accept", "application/json");
request.AddHeader("User-Agent", "Fiddler");
request.Parameters.Clear();
request.AddParameter("auth_token", _apiKey);
request.AddParameter("application/json", json, ParameteType.RequestBody);
return client.Execute(request);
}
The response error message:
{
"error": {
"code": 400,
"message": "The request requires a properly encoded body with the 'content-type' header set to '['application/json']",
"type": "Bad Request" }
}
Fiddler request raw data:
POST **omitted** HTTP/1.1
Accept: application/json, application/xml, text/json, text/x-json,text/javascript, text/xml
User-Agent: RestSharp/105.0.1.0
Content-Type: application/x-www-form-urlencoded
Host: **omitted**
Content-Length: 51
Accept-Encoding: gzip, deflate
Connection: Keep-Alive
As you can see, the request Content-Type is still application/x-www-form-urlencoded. Any ideas? (thanks in advance)
- 6 years ago
It appears this is a misunderstanding of how RestSharp interprets parameters for post requests. From John Sheehan's post on the google group:
If it's a GET request, you can't have a request body and AddParameter adds values to the URL querystring. If it's a POST you can't include a POST parameter and a serialized request body since they occupy the same space. You could do a multipart POST body but this is not very common. Unfortunately if you're making a POST the only way to set the URL querystring value is through either string concatenation or UrlSegments:
var key = "12345";
var request = new RestRequest("api?key=" + key);
// or
var request = new RestRequest("api?key={key});
request.AddUrlSegment("key", "12345");
My revised Execute request method that now works looks like this:
private IRestResponse ExecuteRequestAsPost<T>(T model, string resource, Method method)
{
resource += "?auth_token={token}";
var client = CreateRestClient();
var request = new RestRequest(resource, method) { RequestFormat = DataFormat.Json };
var json = JsonConvert.SerializeObject(model);
request.AddHeader("User-Agent", "Fiddler");
request.AddUrlSegment("token", _apiKey);
request.AddParameter("application/json", json, ParameterType.RequestBody);
return client.Execute(request);
}
It appears this is a misunderstanding of how RestSharp interprets parameters for post requests. From John Sheehan's post on the google group:
If it's a GET request, you can't have a request body and AddParameter adds values to the URL querystring. If it's a POST you can't include a POST parameter and a serialized request body since they occupy the same space. You could do a multipart POST body but this is not very common. Unfortunately if you're making a POST the only way to set the URL querystring value is through either string concatenation or UrlSegments:
var key = "12345";
var request = new RestRequest("api?key=" + key);
// or
var request = new RestRequest("api?key={key});
request.AddUrlSegment("key", "12345");
My revised Execute request method that now works looks like this:
private IRestResponse ExecuteRequestAsPost<T>(T model, string resource, Method method)
{
resource += "?auth_token={token}";
var client = CreateRestClient();
var request = new RestRequest(resource, method) { RequestFormat = DataFormat.Json };
var json = JsonConvert.SerializeObject(model);
request.AddHeader("User-Agent", "Fiddler");
request.AddUrlSegment("token", _apiKey);
request.AddParameter("application/json", json, ParameterType.RequestBody);
return client.Execute(request);
}
It appears this is a misunderstanding of how RestSharp interprets parameters for post requests. From John Sheehan's post on the google group:
If it's a GET request, you can't have a request body and AddParameter adds values to the URL querystring. If it's a POST you can't include a POST parameter and a serialized request body since they occupy the same space. You could do a multipart POST body but this is not very common. Unfortunately if you're making a POST the only way to set the URL querystring value is through either string concatenation or UrlSegments:
var key = "12345";
var request = new RestRequest("api?key=" + key);
// or
var request = new RestRequest("api?key={key});
request.AddUrlSegment("key", "12345");
My revised Execute request method that now works looks like this:
private IRestResponse ExecuteRequestAsPost<T>(T model, string resource, Method method)
{
resource += "?auth_token={token}";
var client = CreateRestClient();
var request = new RestRequest(resource, method) { RequestFormat = DataFormat.Json };
var json = JsonConvert.SerializeObject(model);
request.AddHeader("User-Agent", "Fiddler");
request.AddUrlSegment("token", _apiKey);
request.AddParameter("application/json", json, ParameterType.RequestBody);
return client.Execute(request);
}
Hot Questions