Adicionando cabeçalhos Http ao HttpClient


158

Tudo:

Preciso adicionar cabeçalhos http ao HttpClient antes de enviar uma solicitação para um serviço web. Como faço isso para uma solicitação individual (em vez de no HttpClient para todas as solicitações futuras)? Não tenho certeza se isso é possível.

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();

Respostas:


245

Crie a HttpRequestMessage, defina o método como GET, defina seus cabeçalhos e use em SendAsyncvez 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();

2
Obrigado, Darrel! Fiquei decepcionado HttpClientaté ver que você poderia fazer isso.
Sam

23
@ Talon Isso é o que significa 406. O cliente solicitou um tipo de mídia que o servidor não suporta. Se você não se importa com o tipo de mídia que recebe, não peça um. O OP estava simplesmente perguntando como adicionar cabeçalhos a uma solicitação. Acabei de escolher um exemplo aleatório.
Darrel Miller

15
Hoje em dia você provavelmente quer em var response = await client.SendAsyncvez de ContinueWithetask.Wait()
Michael Parker

1
@MichaelParker Indeed.
Darrel Miller

1
Observe que, para obter o melhor desempenho, você não deve instanciar um cliente HTTP como este. Você pode ler mais sobre isso aqui stackoverflow.com/a/15708633/1406930
ScottBurfieldMills

16

Quando pode ser o mesmo cabeçalho para todas as solicitações ou você descarta o cliente após cada solicitação, pode usar a DefaultRequestHeaders.Addopção:

client.DefaultRequestHeaders.Add("apikey","xxxxxxxxx");      

3
Eu acredito que isso adiciona o cabeçalho a todas as mensagens enviadas por esse HttpClient daqui para frente. Isso contradiz o argumento do OP: "Como faço isso para uma solicitação individual (em oposição a HttpClient para todas as solicitações futuras)?" As instâncias HttpClient foram projetadas para serem criadas uma vez e usadas várias vezes.
Flydog57

Para definir cabeçalhos personalizados em uma solicitação, crie uma solicitação com o cabeçalho personalizado antes de passá-lo ao httpclient para enviar ao servidor http. O cabeçalho padrão é definido no httpclient para enviar todas as solicitações ao servidor.
Zimba

0

Para definir cabeçalhos personalizados A PEDIDO, crie uma solicitação com o cabeçalho personalizado antes de passá-lo ao httpclient para enviar ao servidor http. por exemplo:

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

O cabeçalho padrão é SET ON HTTPCLIENT para enviar todas as solicitações ao servidor.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.