HttpClient の StringContent は charset を付ける
Created at:
tl;dr
- .NET の
HttpClient
のStringContent
は自動でContent-Type
にcharset=<encoding>
を付ける - 不要な場合は
StringContent.Headers.ContentType
を手で設定しなおす必要がある
はじまり
HttpClient
でとある API (POST) を呼び出すとなぜか動かない… curl
で同じ内容を投げると動くのに…という相談を受けて、そんな不思議なことが?と思って調べてみたのが始まりでした。
.NET の HttpClient, StringContent は自動で charset を付ける
curl
で動いているなら .NET の HttpClient が投げるものが何か違うのではと思って、リクエストやリクエストを作っているところを確認してみました。
// Initialize the 'Content-Type' header with information provided by parameters.
MediaTypeHeaderValue headerValue = new MediaTypeHeaderValue((mediaType == null) ? DefaultMediaType : mediaType);
headerValue.CharSet = (encoding == null) ? HttpContent.DefaultStringEncoding.WebName : encoding.WebName;
Headers.ContentType = headerValue;
StringContent
クラスのコンストラクターのコードではメディアタイプとともに CharSet
プロパティを設定したものをヘッダーの ContentType
プロパティに設定しています。この CharSet
プロパティは Content-Type の charset 指定になります。
つまり StringContent
クラスを使って投げるリクエストを作るとデフォルトで application/json; charset=utf-8
のような Content-Type で送られるということになります。
ContentType
を再設定する
charset
パラメータが必ずついてしまうということが分かったので、付けずにリクエストを送信したいという場合にはこれを変える必要があります。
といってもやることは簡単で後から手動で ContentType
プロパティを再設定してあげれば大丈夫です。
content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json");