Hinzufügen von HTTP-Headern zu HTTP-Client

158

Alles:

Ich muss dem HttpClient http-Header hinzufügen, bevor ich eine Anfrage an einen Webdienst sende. Wie mache ich das für eine einzelne Anfrage (im Gegensatz zum HttpClient für alle zukünftigen Anfragen)? Ich bin mir nicht sicher, ob das überhaupt möglich ist.

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
quelle

Antworten:

245

Erstellen Sie eine HttpRequestMessage, setzen Sie die Methode auf GET, setzen Sie Ihre Header und verwenden Sie SendAsyncstattdessen anstelle von 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
quelle
2
Danke, Darrel! Ich war enttäuscht, HttpClientbis ich sah, dass Sie dies tun konnten.
Sam
23
@Talon Das bedeutet 406. Der Client hat nach einem Medientyp gefragt, den der Server nicht unterstützt. Wenn es Ihnen egal ist, welchen Medientyp Sie erhalten, fragen Sie nicht nach einem. Das OP fragte lediglich, wie man einer Anfrage Header hinzufügt. Ich habe nur ein zufälliges Beispiel ausgewählt.
Darrel Miller
15
In diesen Tagen möchten Sie wahrscheinlich var response = await client.SendAsyncanstelle von ContinueWithundtask.Wait()
Michael Parker
1
@ MichaelParker In der Tat.
Darrel Miller
1
Bitte beachten Sie, dass Sie für eine optimale Leistung einen solchen HTTP-Client nicht instanziieren sollten. Sie können mehr darüber hier lesen stackoverflow.com/a/15708633/1406930
ScottBurfieldMills
15

Wenn es sich bei allen Anforderungen um denselben Header handeln kann oder Sie den Client nach jeder Anforderung entsorgen, können Sie die folgende DefaultRequestHeaders.AddOption verwenden:

client.DefaultRequestHeaders.Add("apikey","xxxxxxxxx");      
Taran
quelle
3
Ich glaube, dass dies den Header zu allen Nachrichten hinzufügt, die von diesem HttpClient in Zukunft gesendet werden. Dies widerspricht dem Punkt des OP: "Wie mache ich das für eine einzelne Anfrage (im Gegensatz zum HttpClient für alle zukünftigen Anfragen)?" HttpClient-Instanzen können einmal erstellt und mehrfach verwendet werden.
Flydog57
Um benutzerdefinierte Header für eine Anforderung festzulegen, erstellen Sie eine Anforderung mit dem benutzerdefinierten Header, bevor Sie sie an httpclient übergeben, um sie an den http-Server zu senden. Der Standardheader ist auf httpclient festgelegt, um bei jeder Anforderung an den Server zu senden.
Zimba
0

Um benutzerdefinierte Header auf eine Anfrage zu setzen, erstellen Sie eine Anforderung mit dem benutzerdefinierten Header, bevor Sie sie an httpclient übergeben, um sie an den http-Server zu senden. z.B:

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

Der Standardheader ist SET ON HTTPCLIENT, um bei jeder Anforderung an den Server zu senden.

Zimba
quelle