RestSharp是否覆盖手动设置Content-Type?

时间:2012-02-24 14:33:52

标签: c# restsharp

我正在通过以下方式创建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 - 错误并且WireShark显示Media-Type设置为text/xml(就像在AddParameter-Method中设置的那样)。

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

2 个答案:

答案 0 :(得分: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.JsonSerializerISerializer的实现(可用于覆盖默认序列化)声明它们自己的Content-Types,这是通过您正在使用的janky AddParameter()重载传递的内容。

AddParameter(contentType, content, ParameterType.RequestBody)从未打算直接调用。它被添加为一种解决方法,以传递来自AddBody()的数据,但随后其他事情依赖于它,因此它陷入困境。事后看来这是一个可怕的决定,但是在1xx版本系列中更改它为时已晚。如果我构建另一个版本,我会更明显。

答案 1 :(得分:1)

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

let dictionary = Locksmith.loadDataForUserAccount("gameKeyChainValues")

print("Ended \(EndDateAndTimeString)")

do {
   try Locksmith.updateData(["BattleEnd": "12345678"], forUserAccount: "gameKeyChainValues")

}
catch {
    print("Unable to set time")
}

print("This line ran")

if let timeBattleEnded = dictionary!["BattleEnd"] as? String {
    print("Stored for END: \(timeBattleEnded)")
}