RestSharp是否会覆盖手动设置的Content-Type?
题
我正在通过以下方式创建 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 显示与 WireShark 不同的内容类型?如何防止 Content-Type 被更改(如果是)?
解决方案
斯维克的评论是正确的。在第一个参数中设置内容类型 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.JsonSerializer
用来。的实施 ISerializer
(您可以使用它来覆盖默认序列化)声明自己的内容类型,这是通过 janky 传递的内容 AddParameter()
您正在使用的超载。
AddParameter(contentType, content, ParameterType.RequestBody)
从来不打算直接调用。它是作为一种解决方法添加的,用于传递来自的数据 AddBody()
但后来其他事情变得依赖于它,所以它一直存在。事后看来,这是一个糟糕的决定,但在 1xx 版本中更改它已经太晚了。如果我构建另一个版本,我会让这一点更加明显。
其他提示
设置正文内容时可以更改 Content-Type。Body 的 NAME 参数设置 Content-Type。
oRequest.Parameters.Add(new Parameter() { Name = "application/json;charset=UTF-8", Type = ParameterType.RequestBody, Value = sBody });