[C#] How to Specify Headers (Accept / Content-Type) in HttpClient

目次

Overview

When communicating with a Web API, you must inform the server about what data format you want to receive (Accept) and what format you are currently sending (Content-Type) via HTTP headers. In HttpClient, common request headers are set using the DefaultRequestHeaders property, while headers specific to the data being sent (like Content-Type) are configured within the HttpContent class.


Specifications (Input/Output)

  • Input: Web API URL.
  • Output: Retrieved JSON data (string).
  • Action: Sends a GET request with the header Accept: application/json attached.

Basic Usage

1. Specifying the Received Format (Accept)

This tells the server, “I would like the response to be in JSON.” This is typically set during the initialization of the HttpClient.

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

2. Specifying the Sent Format (Content-Type)

This tells the server, “I am sending you JSON” (usually for POST or PUT). This is set on the content being sent (StringContent), not on the HttpClient itself.

// Specified when creating the data to POST
var content = new StringContent(jsonString, Encoding.UTF8, "application/json");
await client.PostAsync(url, content);

Full Code Example

The following code demonstrates a GET request that specifies the Accept header to prioritize a JSON response.

using System;
using System.Net.Http;
using System.Net.Http.Headers; // Required for header value types
using System.Threading.Tasks;

class Program
{
    // Reuse the HttpClient instance
    private static readonly HttpClient _client = new HttpClient();

    static async Task Main()
    {
        // 1. Setting common headers
        // Accept Header: Tells the server we prefer a JSON response
        _client.DefaultRequestHeaders.Accept.Clear();
        _client.DefaultRequestHeaders.Accept.Add(
            new MediaTypeWithQualityHeaderValue("application/json"));

        // User-Agent can be specified similarly (required by some APIs)
        _client.DefaultRequestHeaders.UserAgent.ParseAdd("C#App/1.0");

        // Example API URL
        string url = "http://echo.jsontest.com/key/123/value/Hello";

        Console.WriteLine($"Sending request: {url}");

        try
        {
            // 2. Executing the GET request
            // The configured headers are automatically included
            string result = await _client.GetStringAsync(url);

            Console.WriteLine("--- Received Data ---");
            Console.WriteLine(result);
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error: {ex.Message}");
        }
    }
}

Customization Points

  • Authentication Tokens: Use DefaultRequestHeaders for the Authorization header (e.g., Bearer tokens)._client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "YOUR_ACCESS_TOKEN");
  • Custom Headers: Use the Add method for non-standard headers (e.g., X-API-Key)._client.DefaultRequestHeaders.Add("X-API-Key", "secret_key");

Important Notes

  • Content-Type Placement: A common mistake is attempting to set Content-Type in DefaultRequestHeaders. This will fail because Content-Type is an attribute of the “data entity” being sent. You must specify it in the constructor of classes like StringContent or ByteArrayContent.
  • Duplicate Headers: The Accept.Add method appends to a list. If you call it multiple times on the same instance, you will have multiple entries. It is safer to call .Clear() before reconfiguring.

Advanced Application

Specifying Content-Type in a POST Request

If you need to send data and specify its format, use the following approach:

// JSON data to send
string json = "{\"name\":\"gushwell\"}";

// Specify Content-Type: application/json in the third argument
using var content = new StringContent(json, System.Text.Encoding.UTF8, "application/json");

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

Conclusion

Recognizing that these headers belong in different places based on their roles is essential for correct HttpClient implementation.

Use client.DefaultRequestHeaders for the Accept header to define what the client wants to receive.

Use the arguments in new StringContent(…) for the Content-Type header to define what the client is sending.

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

この記事を書いた人

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

目次