RestSharpが上書き手動でコンテンツタイプを設定しますか?
質問
rethSharp.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を変更するのを防ぐ方法(そうであれば)?
解決
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
(デフォルトのシリアル化をオーバーライドするために使用できる)の実装は、使用しているJanky AddParameter()
オーバーロードを渡すものである独自のコンテンツ型を宣言します。
AddParameter(contentType, content, ParameterType.RequestBody)
は直接呼び出されることを意図していませんでした。 AddBody()
からのデータを渡すことを回避する回避策として追加されましたが、他のものはそれがまったく立ち往生しています。それは後知でひどい決断でしたが、1xxのバージョンラインでそれを変更するのは遅すぎます。私が今までに別のバージョンを構築したら、これをより明白にします。
他のヒント
ボディコンテンツを設定したときのcontent-typeの変更可能です。BODYの名前パラメーターは、Content-Typeを設定します。
oRequest.Parameters.Add(new Parameter() { Name = "application/json;charset=UTF-8", Type = ParameterType.RequestBody, Value = sBody });
.