概要
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");
注意点
- Content-Typeの設定場所: 初心者が最も陥りやすい罠ですが、
Content-TypeはDefaultRequestHeadersに設定できません。Content-Typeは「送るデータ(エンティティ)」に紐付く属性だからです。必ずStringContentやByteArrayContentのコンストラクタで指定してください。 - ヘッダーの重複追加:
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(...) などのコンテンツ生成時の引数で設定する必要があります。両者は設定する場所と役割が明確に異なるため、混同しないよう区別して実装することが重要です。
