[C#] HttpClientでJSONデータをPOSTする

HttpClientクラスを使って、Web APIなんかにJSONでデータをPOST送信する。

んなもん、なんでもないやろーと思ってテキトーにやろうとしたら、あれれあれれと、意外とはまってしまった。
ので一応備忘メモ。

↓こんなPerson的なJSONを送りたいとして

{
  "age" : 20,
  "name" : "太郎"
}

答えから書いてしまうと、↓こう。

var json = "{ \"age\" : 20, \"name\" : \"太郎\"  }";

using (var client = new HttpClient())
{
    var content = new StringContent(json, Encoding.UTF8, "application/json");

    var response = await client.PostAsync("http://somehost/someapi", content);
    ...
}

まあJSON手書きとかはあんまりやりたくないだろうから、そのへんはJson.NET使ってシリアライズするとか。

[JsonObject]
public class Person
{
    [JsonProperty("age")]
    public int Age { get; private set; }

    [JsonProperty("name")]
    public string Name { get; private set; }

    public Person(int age, string name)
    {
        this.Age = age;
        this.Name = name;
    }
}

↑これを↓こう。

var person = new Person(20, "太郎");
var json = JsonConvert.SerializeObject(person);

using (var client = new HttpClient())
{
    var content = new StringContent(json, Encoding.UTF8, "application/json");

    var response = await client.PostAsync("http://somehost/someapi", content);
    ...
}

その他、Acceptヘッダとかつける必要があれば

var accept = new MediaTypeWithQualityHeaderValue("application/json");
client.DefaultRequestHeaders.Accept.Add(accept);

という感じで。

以上。