【C#】HttpClientでJSONデータをPOST送信する方法

目次

概要

Web APIに対してJSON形式のデータを送信する基本的な実装です。 オブジェクトをJSON文字列にシリアライズし、StringContent クラスを使用して Content-Type: application/json ヘッダーと共にPOSTリクエストを送信します。

仕様(入出力)

  • 入力: 送信したいデータ(C#のオブジェクトや匿名型)。
  • 出力: サーバーからの応答結果。
  • 動作: データをJSON化し、UTF-8エンコーディングで送信する。
  • 前提: .NET標準ライブラリ(System.Net.Http, System.Text.Json)を使用。

基本の使い方

手順は「シリアライズ」→「StringContent作成」→「送信」の3ステップです。 StringContent のコンストラクタ第3引数で "application/json" を指定することが最も重要です。

// 1. データをJSON文字列に変換
var data = new { Name = "Data", Value = 123 };
string json = JsonSerializer.Serialize(data);

// 2. HTTPコンテンツを作成(ここで Content-Type を指定)
using var content = new StringContent(json, Encoding.UTF8, "application/json");

// 3. POST送信
await client.PostAsync("https://example.com/api", content);

コード全文

ここでは、検索条件を含むオブジェクトを作成し、それをJSONとしてAPIに送信して結果を受け取るコードを提示します。

using System;
using System.Net.Http;
using System.Text; // Encodingに必要
using System.Text.Json; // JSONシリアライズに必要
using System.Threading.Tasks;

class Program
{
    private static readonly HttpClient _httpClient = new HttpClient();

    static async Task Main()
    {
        string url = "https://httpbin.org/post";
        Console.WriteLine($"送信先: {url}");

        // 1. 送信データの作成(匿名型を使用)
        var requestData = new
        {
            TotalCount = 10,
            Filters = new[]
            {
                new { Keyword = "network", MaxSize = 20 },
                new { Keyword = "database", MaxSize = 50 }
            },
            Options = new
            {
                Encode = "UTF-8",
                IsRecursive = true
            }
        };

        try
        {
            // 2. JSONシリアライズ
            // 日本語が含まれる場合は Encoder 設定が必要な場合がありますが、今回は標準設定で行います
            string jsonString = JsonSerializer.Serialize(requestData);
            
            Console.WriteLine("--- 送信するJSON ---");
            Console.WriteLine(jsonString);

            // 3. StringContentの作成
            // 第2引数: エンコーディング (通常は UTF8)
            // 第3引数: メディアタイプ ("application/json" を指定しないと text/plain 扱いになることが多い)
            using var content = new StringContent(jsonString, Encoding.UTF8, "application/json");

            // 4. POST送信
            using var response = await _httpClient.PostAsync(url, content);

            // 成功確認
            response.EnsureSuccessStatusCode();

            // 結果表示
            string responseBody = await response.Content.ReadAsStringAsync();
            Console.WriteLine("\n--- サーバーからの応答 ---");
            Console.WriteLine(responseBody);
        }
        catch (Exception ex)
        {
            Console.WriteLine($"エラーが発生しました: {ex.Message}");
        }
    }
}

実行結果例(httpbin.orgの応答)

--- 送信するJSON ---
{"TotalCount":10,"Filters":[{"Keyword":"network","MaxSize":20}...]}

--- サーバーからの応答 ---
{
  "json": {
    "Filters": [
      {
        "Keyword": "network", 
        "MaxSize": 20
      }, 
      ...
    ], 
    "TotalCount": 10
  }, 
  "headers": {
    "Content-Type": "application/json; charset=utf-8", 
    ...
  }
}

カスタムポイント

  • System.Text.Json vs Newtonsoft.Json: 古いプロジェクトでは JsonConvert.SerializeObject(data) (Newtonsoft) が使われることもありますが、現在(.NET Core 3.1以降)は標準の System.Text.Json が推奨されます。
  • エンコーディング: 基本的に Encoding.UTF8 で問題ありませんが、Shift-JIS等のレガシーシステム相手の場合は Encoding.GetEncoding(...) を使用する必要があります。

注意点

  1. Media Typeの指定: StringContent のコンストラクタで "application/json" を指定し忘れると、デフォルトの text/plain として送信され、サーバー側でJSONとして認識されないトラブルが多発します。必ず指定してください。
  2. 非同期処理: シリアライズ処理自体は同期メソッド(Serialize)で行っても小規模データなら問題ありませんが、巨大なデータを扱う場合はストリームや非同期シリアライズの検討が必要です。

応用

PostAsJsonAsync (.NET 5+)

.NET 5 以降では、System.Net.Http.Json 拡張メソッドを使用することで、シリアライズと送信を1行で行うことができます。StringContent を手動で作る必要がなくなります。

using System.Net.Http.Json; // これが必要

// オブジェクトを直接渡せる
await _httpClient.PostAsJsonAsync(url, requestData);

まとめ

JSONデータをPOSTする場合、StringContent クラスを使用してリクエストボディを構築するのが基本の手順となります。その際、コンストラクタでデータ形式として application/json を明示的に指定することが、サーバーに正しくデータを解釈させるための必須条件です。また、.NETのバージョンが新しい場合は、より簡潔な PostAsJsonAsync メソッドの利用も検討してください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次