16

我正在通过以下方式创建 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 返回一个 -Error415 Media Not Supported并且 WireShark 显示 Media-Type 设置为text/xml(如在 AddParameter-Method 中设置)。

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

4

2 回答 2

20

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.JsonSerializer使用 。的实现(您可以使用它来覆盖默认序列化)声明自己的 Content-Types ,这是通过您正在使用ISerializer的 janky 重载传递的内容。AddParameter()

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

于 2012-02-24T18:58:29.527 回答
1

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

oRequest.Parameters.Add(new Parameter() { Name = "application/json;charset=UTF-8", Type = ParameterType.RequestBody, Value = sBody });
于 2016-08-05T18:37:53.907 回答