【C#】HttpClientでヘッダー(Accept / Content-Type)を指定する方法

目次

概要

Web APIと通信する際、サーバーに対して「どのような形式のデータが欲しいか(Accept)」や「どのような形式のデータを送っているか(Content-Type)」をHTTPヘッダーで伝える必要があります。 HttpClient では、共通のヘッダーは DefaultRequestHeaders プロパティで設定し、送信データ個別のヘッダー(Content-Type等)は HttpContent クラスで設定します。

仕様(入出力)

  • 入力: Web APIのURL。
  • 出力: 取得したJSONデータ(文字列)。
  • 動作: リクエストヘッダーに Accept: application/json を付与してGETリクエストを送信する。

基本の使い方

1. 受信形式の指定 (Accept)

サーバーに「JSONで返してほしい」と伝える場合です。HttpClient の初期化時に設定します。

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

2. 送信形式の指定 (Content-Type)

サーバーに「JSONを送ります」と伝える場合です(POST/PUT時)。これは HttpClient ではなく、送信するコンテンツ(StringContent)に対して設定します。

// POSTするデータを作成する際に指定
var content = new StringContent(jsonString, Encoding.UTF8, "application/json");
await client.PostAsync(url, content);

コード全文

ここでは入力コードの意図に基づき、「Acceptヘッダーを指定してGETリクエストを送る」修正コードを提示します。

using System;
using System.Net.Http;
using System.Net.Http.Headers; // ヘッダー値の型定義に必要
using System.Threading.Tasks;

class Program
{
    // HttpClientは再利用する
    private static readonly HttpClient _client = new HttpClient();

    static async Task Main()
    {
        // 1. 共通ヘッダーの設定
        // Acceptヘッダー: サーバーに対して「JSON形式のレスポンスを優先的に希望する」と伝える
        _client.DefaultRequestHeaders.Accept.Clear();
        _client.DefaultRequestHeaders.Accept.Add(
            new MediaTypeWithQualityHeaderValue("application/json"));

        // User-Agentヘッダーの指定も同様に行えます(一部のAPIでは必須)
        _client.DefaultRequestHeaders.UserAgent.ParseAdd("C#App/1.0");

        // テスト用APIのURL
        string url = "http://echo.jsontest.com/key/123/value/Hello";

        Console.WriteLine($"リクエスト送信: {url}");

        try
        {
            // 2. GETリクエストの実行
            // 設定したヘッダー情報が含まれて送信されます
            string result = await _client.GetStringAsync(url);

            Console.WriteLine("--- 受信データ ---");
            Console.WriteLine(result);
        }
        catch (Exception ex)
        {
            Console.WriteLine($"エラー: {ex.Message}");
        }
    }
}

カスタムポイント

  • 認証トークン: Authorization ヘッダー(Bearerトークンなど)を設定する場合も DefaultRequestHeaders を使用します。C#_client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "YOUR_ACCESS_TOKEN");
  • カスタムヘッダー: 標準以外のヘッダー(例: X-API-Key)を追加する場合は Add メソッドを使います。C#_client.DefaultRequestHeaders.Add("X-API-Key", "secret_key");

注意点

  1. Content-Typeの設定場所: 初心者が最も陥りやすい罠ですが、Content-TypeDefaultRequestHeaders に設定できませんContent-Type は「送るデータ(エンティティ)」に紐付く属性だからです。必ず StringContentByteArrayContent のコンストラクタで指定してください。
  2. ヘッダーの重複追加: Accept.Add は追加メソッドなので、同じインスタンスに対して何度も呼ぶとリストが増えていきます。再設定する場合は事前に .Clear() を呼ぶのが安全です。

応用

POSTリクエストでContent-Typeを指定する

タイトルにある「Content-Typeを指定したい」が「データを送信したい」という意味だった場合のコードです。

// 送信するJSONデータ
string json = "{\"name\":\"gushwell\"}";

// 第3引数で Content-Type: application/json を指定
using var content = new StringContent(json, System.Text.Encoding.UTF8, "application/json");

// POST送信
var response = await _client.PostAsync("https://example.com/api/users", content);

まとめ

Web APIとの通信において、クライアントが受け取りたいデータ形式を指定する Accept ヘッダーは client.DefaultRequestHeaders で設定を行いますが、送信するデータの形式を指定する Content-Type ヘッダーは new StringContent(...) などのコンテンツ生成時の引数で設定する必要があります。両者は設定する場所と役割が明確に異なるため、混同しないよう区別して実装することが重要です。

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

この記事を書いた人

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

目次