【问题标题】:Set 'Content-Type' header using RestSharp使用 RestSharp 设置“Content-Type”标头
【发布时间】:2013-07-22 19:27:19
【问题描述】:

我正在为 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 标头。
  • 我已经在没有那条线的情况下尝试过。唯一的选择是 JSON 或 XML。
  • 请发布请求在 Fiddler 中的外观,这将说明是否添加了 Content-Type 以及添加了什么内容类型,而这只是猜测。
  • 完成。似乎没有添加标题。见:pastebin.com/B0MjHrgD
  • 查看下面 CodeCaster 的回答,以及我的 cmets 关于名称/值参数类型的问题

标签: c# http-headers restsharp


【解决方案1】:

my blog 上提供的解决方案未在 RestSharp 1.02 版本之后进行测试。如果您针对我的解决方案的具体问题提交评论,我可以更新它。

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);

【讨论】:

  • 在我的具体情况下,'strJSONContent'变量应该包含什么?
  • strJSONContent 是 JSON 字符串,表示您要在 POST 请求期间发送的数据。这必须是有效的 JSON,以便服务器可以正确解释它。使用 RestSharp 并检查包含 JSON 字符串的参数时,结果将包含 mimetype 和数据,如下所示:"application/json={\"key1\":\"value1\",\"key2\": \"value2\"}"
  • var body = new Dictionary() {{"starred_entries", id}}; strJSONContent = request.JsonSerializer.Serialize(body);
  • 关键是不能通过request.AddParameter拥有任何常规的名称/值参数。如果您在 url 中需要它们,则必须将其添加到客户端 url 或请求资源 url。您可以拥有授权和请求正文参数类型。一旦我改变了这个,我在正文中的 json 就被正确发送了。
  • 我的 cmets 是 .AddParameter 不适用于 POST。与 GET 一起正常工作
【解决方案2】:

在 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);

老问题,但仍然是我搜索的首要问题 - 为了完整性而添加。

【讨论】:

  • 这是目前restsharp 105.2.3版本最优雅的解决方案
  • 这并没有提到如何添加内容类型标题 - 你能详细说明一下吗?
  • 嘿@Paul - 我似乎记得当你调用 AddJsonBody 时它们会自动添加。不过我用过它是不久前的事了。
  • 它是否适用于 HTTP GET ? (我问是因为只是从 POST 更改为 GET,具有相同的 JSON 内容,我有一个 NullObjectReferenceException 但代码比基本示例复杂得多)使用 Postman 它可以工作,仅使用 RestSharp 我们有错误。
  • 嘿@Alex75 - 我用 LINQPad 和 Fiddler 进行了尝试,虽然它没有出错,但它也没有在请求中添加正文。我想响应不包含您期望的内容以及结果处理代码异常。这可能也让你感兴趣:stackoverflow.com/questions/978061/http-get-with-request-body
【解决方案3】:

虽然这有点旧:我遇到了同样的问题.. 似乎某些属性,如“内容类型”或“日期”不能作为参数添加,而是在内部添加。要更改“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
  ...
 }

【讨论】:

  • 你能用你正在使用的版本更新这个吗?它有助于向用户提供详细信息。 :)
  • 对我来说,这样更简洁,因为您不必盲目清除参数并且看起来更重要,谢谢。
【解决方案4】:

这里是解决办法

http://restsharp.blogspot.ca/

创建一个具有相同名称属性的json对象并设置值(确保它们与post请求的名称值对相似。)

之后使用默认的httpclient。

【讨论】:

  • 这不是建设性的。问题是关于 RestSharp。指示用户不要使用 RestSharp 并不能解决问题。
【解决方案5】:

【讨论】:

  • 我没有成功地让那个解决方案工作;它仍然将内容类型恢复为application/x-www-form-urlencoded
猜你喜欢
  • 1970-01-01
  • 2013-12-10
  • 2015-05-05
  • 2011-01-04
  • 2014-09-13
  • 1970-01-01
  • 2021-12-22
  • 2012-11-02
  • 2011-01-26
相关资源
最近更新 更多