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を実行すると-Errorが返され、415 Media Not SupportedWireSharkはMedia-Typeがtext/xml(AddParameter-Methodで設定されているように)に設定されていることを示します。

RestSharpがWireSharkとは異なるContent-Typeを表示するのはなぜですか?また、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が使用されます。(デフォルトのシリアル化をオーバーライドするために使用できる)の実装は、ISerializer使用しているぎこちないオーバーロードを通過する独自のContent-Typeを宣言し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 に答える