Agregar encabezados HTTP a HttpClient

158

Todas:

Necesito agregar encabezados http al HttpClient antes de enviar una solicitud a un servicio web. ¿Cómo hago eso para una solicitud individual (a diferencia de en el HttpClient para todas las solicitudes futuras)? No estoy seguro de si esto es posible.

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
fuente

Respuestas:

245

Cree un HttpRequestMessage, establezca el Método en GET, configure sus encabezados y luego use en SendAsynclugar 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
fuente
2
Gracias Darrel! Me decepcionó HttpClienthasta que vi que podías hacer esto.
Sam
23
@Talon Eso es lo que significa 406. El cliente solicitó un tipo de medio que el servidor no admite. Si no le importa el tipo de medio que obtiene, no solicite uno. El OP simplemente preguntaba cómo agregar encabezados a una solicitud. Acabo de elegir un ejemplo al azar.
Darrel Miller
15
Estos días probablemente quieras en var response = await client.SendAsynclugar de ContinueWithytask.Wait()
Michael Parker
1
@MichaelParker De hecho.
Darrel Miller el
1
Tenga en cuenta que para obtener el mejor rendimiento, no debe crear una instancia de un cliente HTTP como este. Puede leer más sobre esto aquí stackoverflow.com/a/15708633/1406930
ScottBurfieldMills
16

Cuando puede ser el mismo encabezado para todas las solicitudes o si dispone del cliente después de cada solicitud, puede usar la DefaultRequestHeaders.Addopción:

client.DefaultRequestHeaders.Add("apikey","xxxxxxxxx");      
Taran
fuente
3
Creo que eso agrega el encabezado a todos los mensajes enviados por ese HttpClient en adelante. Eso contradice el punto del OP: "¿Cómo hago eso para una solicitud individual (en lugar de en el HttpClient para todas las solicitudes futuras)?" Las instancias de HttpClient están diseñadas para crearse una vez y usarse muchas veces.
Flydog57
Para establecer encabezados personalizados en una solicitud, cree una solicitud con el encabezado personalizado antes de pasarla a httpclient para enviarla al servidor http. El encabezado predeterminado se establece en httpclient para enviar cada solicitud al servidor.
Zimba
0

Para configurar encabezados personalizados EN UNA SOLICITUD, cree una solicitud con el encabezado personalizado antes de pasarlo a httpclient para enviarlo al servidor http. p.ej:

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

El encabezado predeterminado es SET ON HTTPCLIENT para enviar en cada solicitud al servidor.

Zimba
fuente