【问题标题】:Does RestSharp overwrite manually set Content-Type?RestSharp 是否覆盖手动设置的 Content-Type?
【发布时间】:2012-03-15 00:03:51
【问题描述】:

我正在通过以下方式创建 RestSharp.RestRequest:

RestRequest request = new RestRequest();
request.Method = Method.POST;
request.Resource = "/rest-uri";

request.AddHeader("Content-Type", "application/someContentType");

string xml = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>" + Environment.NewLine +
             "<register-request">" + Environment.NewLine +
             "    <name=\"someName\"/>" + Environment.NewLine +
             "</register-request>");

request.AddParameter("text/xml", registerSinkRequest, ParameterType.RequestBody);

(Content-Type手动设置为application/someContentType

在调试模式下它还显示Content-Type=application/someContentType

但是执行 RestRequest 会返回一个 415 Media Not Supported-Error 并且 WireShark 显示 Media-Type 设置为 text/xml(就像在 AddParameter-Method 中设置的一样)。

为什么 RestSharp 显示的 Content-Type 与 WireShark 不同?以及如何防止 Content-Type 被更改(如果是的话)?

【问题讨论】:

  • 那么你为什么不在AddParameter()中使用你的application/someContentType呢?

标签: c# restsharp


【解决方案1】:

svick 的评论是正确的。在AddParameter()的第一个参数中设置内容类型,可以省略AddHeader()调用。

虽然这是“正确”的答案,但我将解释为什么它有一种令人困惑的方法来做到这一点,但并不十分明显。

实现此目的的预期方法是使用AddBody()RestRequest.RequestFormat。一个例子:

var client = new RestClient();
// client.XmlSerializer = new XmlSerializer(); // default
// client.XmlSerializer = new SuperXmlSerializer(); // can override with any implementaiton of ISerializer

var request = new RestRequest();
request.RequestFormat = DataFormat.Xml;
request.AddBody(objectToSerialize);

objectToSerialize的序列化是基于注册的XmlSerializer。如果您使用RequestFormat = DataFormat.Json,则使用RestClient.JsonSerializerISerializer 的实现(您可以使用它来覆盖默认序列化)声明它们自己的 Content-Types,这是通过您正在使用的 janky AddParameter() 重载传递的内容。

AddParameter(contentType, content, ParameterType.RequestBody) 从来没有打算被直接调用。它被添加为一种解决方法,以传递来自AddBody() 的数据,但随后其他事物变得依赖于它,因此它一直存在。事后看来,这是一个糟糕的决定,但在 1xx 版本线中更改它为时已晚。如果我构建另一个版本,我会让这一点更加明显。

【讨论】:

  • 如果它不是真的要使用,您可以将其标记为已过时,这样现有程序可以继续工作,但它不再出现在 Intellisense 中,这将阻止大多数用户调用在他们自己的代码中?
  • 我不认为它已经过时了。添加属性[System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] 可能是一个快乐的媒介(?)。
  • 我不想改变它,因为它是另一个问题的广为人知的解决方法。
  • 谢谢 - 我以为我不能在 AddParameter 中使用 contentType,因为我只是得到了奇怪的结果。但似乎,问题出在其他地方。 (RestSharp 可以连接到 HTTPS 资源,对吗?:)
  • 可以的。不过,如果您使用的是单声道,则需要考虑一些因素。
【解决方案2】:

设置正文内容时可以更改 Content-Type。 Body 的 NAME 参数设置 Content-Type。

oRequest.Parameters.Add(new Parameter() { Name = "application/json;charset=UTF-8", Type = ParameterType.RequestBody, Value = sBody });

【讨论】:

    猜你喜欢
    • 2013-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-27
    相关资源
    最近更新 更多