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();
Ryan James
fonte

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();
Darrel Miller
fonte
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");      
Taran
fonte
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.

Zimba
fonte