使用RestSharp设置“Content-Type”头

40

我正在为一个RSS阅读服务构建客户端。我正在使用RestSharp库与他们的API进行交互。

API说明如下:

在创建或更新记录时,您必须将application/json;charset=utf-8设置为Content-Type标头。

这是我的代码样子:

RestRequest request = new RestRequest("/v2/starred_entries.json", Method.POST);
request.AddHeader("Content-Type", "application/json; charset=utf-8");
request.RequestFormat = DataFormat.Json;
request.AddParameter("starred_entries", id);

//Pass the request to the RestSharp client
Messagebox.Show(rest.ExecuteAsPost(request, "POST").Content);

然而,该服务正在返回一个错误。

错误415:请使用“Content-Type: application/json; charset=utf-8”头部

为什么RestSharp没有传递头部?


我不熟悉RestSharp,但我会使用Fiddler来检查请求,以确保RestSharp正在传递什么。可能已经添加了Content-Type标头,您需要替换或删除/添加它。我会假设request.RequestFormat = DataFormat.Json为您设置了Content-Type标头。 - Randy James
我已经尝试过加上或不加上那行代码。唯一的选项是JSON或XML。 - Shane Gowland
请在 Fiddler 中发布请求的外观,这将告诉我们是否添加了 Content-Type 以及添加了什么,否则只能猜测。 - Darius
完成。似乎没有添加标题。请参见:http://pastebin.com/B0MjHrgD - Shane Gowland
请参考CodeCaster的答案以及我关于名称/值参数类型的评论。 - drewid
5个回答

71

本人在我的博客上提供的解决方案,未经过1.02版本以外的RestSharp版本测试。如果您对我的解决方案有特定问题,请在评论中告诉我,我可以进行更新。

var client = new RestClient("http://www.example.com/where/else?key=value");
var request = new RestRequest();

request.Method = Method.POST;
request.AddHeader("Accept", "application/json");
request.Parameters.Clear();
request.AddParameter("application/json", strJSONContent, ParameterType.RequestBody);

var response = client.Execute(request);

2
在我的具体情况下,'strJSONContent' 变量应包含什么? - Shane Gowland
1
strJSONContent是代表POST请求中要发送数据的JSON字符串。它必须是有效的JSON,以便服务器能够正确解释。使用RestSharp并检查包含JSON字符串的参数时,结果将包含mimetype和数据,如下所示:"application/json={"key1":"value1","key2":"value2"}" - Itanex
1
var body = new Dictionary<string, string>() {{"starred_entries", id}}; strJSONContent = request.JsonSerializer.Serialize(body); - Alex Che
1
关键是你不能通过request.AddParameter来传递任何常规的名称/值参数。如果你需要他们在url中,你必须将它添加到客户端url或请求资源url中。你可以有授权和请求体参数类型。一旦我改变了这个问题,我的json请求正常发送了。 - drewid
我的评论是,.AddParameter不适用于POST。在GET中运行良好。 - drewid
显示剩余3条评论

40
在105.2.3.0版本中,我可以这样解决问题:
var client = new RestClient("https://www.example.com");
var request = new RestRequest("api/v1/records", Method.POST);
request.AddJsonBody(new { id = 1, name = "record 1" });
var response = client.Execute(request);

这是一个老问题,但仍然是我搜索结果的最佳答案- 为了完整性而添加。


1
这并没有提到如何添加内容类型标头 - 你能详细说明一下吗? - Paul
3
嘿 @Paul - 我记得当你调用AddJsonBody时,它们会自动添加。不过我好像是很久以前使用的了。 - Tom Elmore
它支持HTTP GET吗?(我问这个问题是因为只是从POST更改为GET,使用相同的JSON内容,我遇到了NullObjectReferenceException,但代码比基本示例复杂得多)使用Postman可以工作,只有使用RestSharp时我们才会遇到错误。 - Alex 75
嘿@Alex75-我使用LINQPad和Fiddler尝试了一下,虽然没有出现错误,但也没有向请求添加主体。我想响应不包含您期望的内容,因此处理代码异常。这也可能会让您感兴趣:https://dev59.com/53NA5IYBdhLWcg3wZ85S - Tom Elmore
啊,谢谢你提供的链接,真的很详细!不过坏消息是我和同事们争论了一下更改搜索请求(日志显示“GET Account balance bla bla bla”),目前使用POST方法进行,但我们想要使用GET HTTP方法。这个方法在我们通过RestSharp“层”重定向调用时运行良好。但现在,因为他们不允许我使用GET+查询字符串来替换当前的JSON主体内容,所以我只能接受POST + 主体内容来实际在后端进行搜索。太遗憾了 :-( 再次感谢您的回复。 - Alex 75
显示剩余2条评论

12
尽管这有点老旧:我也遇到了同样的问题...看起来像"content-type"或"date"这样的某些属性不能作为参数添加,但会在内部添加。要更改"content-type"的值,我必须更改序列化程序设置(尽管我没有使用它,因为我在正文中添加了一个已序列化的json!)
RestClient client = new RestClient(requURI);
RestRequest request = new RestRequest(reqPath, method);
request.JsonSerializer.ContentType = "application/json; charset=utf-8";

一旦我这样做了,标题就按预期显示出来了:

 System.Net Information: 0 : [5620] ConnectStream#61150033 -   Header 
 {
  Accept: application/json, application/xml, text/json, text/x-json, text/javascript, text/xml
  User-Agent: RestSharp 104.1.0.0
  Content-Type: application/json; charset=utf-8
  ...
 }

你能否更新一下你正在使用的版本?这有助于向用户提供详细信息。 :) - Itanex
对我来说,这更清晰,因为你不必盲目地清除参数,看起来更加到位,谢谢。 - Ismail Hawayel

3

我还没有成功让那个解决方案起作用;它仍然将内容类型恢复为“application/x-www-form-urlencoded”。 - Shane Gowland

-4

这是解决方案

http://restsharp.blogspot.ca/

创建一个JSON对象,具有相同名称属性并设置值(确保它们与用于POST请求的名称值对类似)。
之后使用默认的httpclient。

1
这并不是建设性的。问题涉及RestSharp。告诉用户不要使用RestSharp并不能解决问题。 - Itanex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接