Ajout d'en-têtes Http à HttpClient

158

Tout:

J'ai besoin d'ajouter des en-têtes http au HttpClient avant d'envoyer une demande à un service Web. Comment faire cela pour une demande individuelle (par opposition à HttpClient pour toutes les demandes futures)? Je ne suis même pas sûr que cela soit possible.

var client = new HttpClient();
var task =
    client.GetAsync("http://www.someURI.com")
    .ContinueWith((taskwithmsg) =>
    {
        var response = taskwithmsg.Result;

        var jsonTask = response.Content.ReadAsAsync<JsonObject>();
        jsonTask.Wait();
        var jsonObject = jsonTask.Result;
    });
task.Wait();
Ryan James
la source

Réponses:

245

Créez un HttpRequestMessage, définissez la méthode sur GET, définissez vos en-têtes, puis utilisez à la SendAsyncplace de GetAsync.

var client = new HttpClient();
var request = new HttpRequestMessage() {
    RequestUri = new Uri("http://www.someURI.com"),
    Method = HttpMethod.Get,
};
request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("text/plain"));
var task = client.SendAsync(request)
    .ContinueWith((taskwithmsg) =>
    {
        var response = taskwithmsg.Result;

        var jsonTask = response.Content.ReadAsAsync<JsonObject>();
        jsonTask.Wait();
        var jsonObject = jsonTask.Result;
    });
task.Wait();
Darrel Miller
la source
2
Merci, Darrel! J'ai été déçu HttpClientjusqu'à ce que je voie que vous pouviez faire cela.
Sam
23
@Talon C'est ce que signifie 406. Le client a demandé un type de média que le serveur ne prend pas en charge. Si vous ne vous souciez pas du type de média que vous obtenez, alors n'en demandez pas. Le PO demandait simplement comment ajouter des en-têtes à une demande. Je viens de choisir un exemple aléatoire.
Darrel Miller
15
Ces jours-ci, vous voulez probablement var response = await client.SendAsyncau lieu de ContinueWithettask.Wait()
Michael Parker
1
@MichaelParker En effet.
Darrel Miller
1
Veuillez noter que pour de meilleures performances, vous ne devez pas instancier un client HTTP comme celui-ci. Vous pouvez en savoir plus à ce sujet ici stackoverflow.com/a/15708633/1406930
ScottBurfieldMills
16

Lorsqu'il peut s'agir du même en-tête pour toutes les demandes ou que vous supprimez le client après chaque demande, vous pouvez utiliser l' DefaultRequestHeaders.Addoption:

client.DefaultRequestHeaders.Add("apikey","xxxxxxxxx");      
Taran
la source
3
Je crois que cela ajoute l'en-tête à tous les messages envoyés par ce HttpClient à l'avenir. Cela contredit le point du PO: "Comment puis-je faire cela pour une demande individuelle (par opposition à sur HttpClient pour toutes les demandes futures)?" Les instances HttpClient sont conçues pour être créées une fois et utilisées plusieurs fois.
Flydog57
Pour définir des en-têtes personnalisés sur une requête, créez une requête avec l'en-tête personnalisé avant de la transmettre à httpclient pour l'envoyer au serveur http. L'en-tête par défaut est défini sur httpclient pour être envoyé à chaque demande au serveur.
Zimba
0

Pour définir des en-têtes personnalisés SUR UNE DEMANDE, créez une requête avec l'en-tête personnalisé avant de la transmettre au client http pour l'envoyer au serveur http. par exemple:

HttpClient client = HttpClients.custom().build();
HttpUriRequest request = RequestBuilder.get()
  .setUri(someURL)
  .setHeader(HttpHeaders.CONTENT_TYPE, "application/json")
  .build();
client.execute(request);

L'en-tête par défaut est SET ON HTTPCLIENT à envoyer à chaque demande au serveur.

Zimba
la source