我正在通过以下方式创建 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 });
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top