เพิ่ม Http Headers ให้กับ HttpClient


158

ทั้งหมด:

ฉันต้องเพิ่มส่วนหัว http ไปยัง HttpClient ก่อนที่จะส่งคำขอไปยังบริการเว็บ ฉันจะทำเช่นนั้นสำหรับคำขอส่วนบุคคล (ตรงข้ามกับ HttpClient กับคำขอในอนาคตทั้งหมด) ได้อย่างไร ฉันไม่แน่ใจว่าสิ่งนี้เป็นไปได้หรือไม่

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

คำตอบ:


245

สร้างHttpRequestMessageกำหนดวิธีการในการGETตั้งค่าส่วนหัวของคุณและจากนั้นใช้แทนSendAsyncGetAsync

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
ขอบคุณ Darrel! ฉันผิดหวังด้วยHttpClientจนกระทั่งฉันเห็นว่าคุณสามารถทำได้
Sam

23
@Talon นั่นคือสิ่งที่ 406 หมายถึง ลูกค้าขอสื่อประเภทที่เซิร์ฟเวอร์ไม่รองรับ หากคุณไม่สนใจประเภทสื่อที่คุณได้รับอย่าถามหา OP เพิ่งถามถึงวิธีการเพิ่มส่วนหัวในคำขอ ฉันแค่เลือกตัวอย่างแบบสุ่ม
Darrel Miller

15
วันนี้คุณอาจต้องการvar response = await client.SendAsyncแทนContinueWithและtask.Wait()
Michael Parker

1
@MichaelParker แน่นอน
Darrel Miller

1
โปรดทราบว่าเพื่อประสิทธิภาพที่ดีที่สุดคุณไม่ควรยกตัวอย่างไคลเอ็นต์ HTTP เช่นนี้ คุณสามารถอ่านเพิ่มเติมเกี่ยวกับเรื่องนี้ได้ที่นี่stackoverflow.com/a/15708633/1406930
ScottBurfieldMills

16

เมื่อสามารถเป็นส่วนหัวเดียวกันสำหรับคำขอทั้งหมดหรือคุณทิ้งลูกค้าหลังจากคำขอแต่ละครั้งคุณสามารถใช้DefaultRequestHeaders.Addตัวเลือก:

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

3
ฉันเชื่อว่าจะเพิ่มส่วนหัวให้กับข้อความทั้งหมดที่ส่งโดย HttpClient ต่อไป สิ่งนั้นขัดแย้งกับประเด็นของ OP: "ฉันจะทำเช่นนั้นอย่างไรสำหรับคำขอส่วนบุคคล (ตรงข้ามกับ HttpClient กับคำขอในอนาคตทั้งหมด)" อินสแตนซ์ HttpClient ถูกออกแบบมาเพื่อสร้างครั้งเดียวและใช้หลายครั้ง
Flydog57

หากต้องการตั้งค่าส่วนหัวที่กำหนดเองในคำขอให้สร้างคำขอด้วยส่วนหัวที่กำหนดเองก่อนส่งผ่านไปยัง httpclient เพื่อส่งไปยังเซิร์ฟเวอร์ http ส่วนหัวเริ่มต้นถูกตั้งค่าเป็น httpclient เพื่อส่งคำขอทุกครั้งไปยังเซิร์ฟเวอร์
Zimba

0

หากต้องการตั้งค่าส่วนหัวที่กำหนดเองตามคำขอให้สร้างคำขอด้วยส่วนหัวที่กำหนดเองก่อนส่งผ่านไปยัง httpclient เพื่อส่งไปยังเซิร์ฟเวอร์ http เช่น:

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

ส่วนหัวเริ่มต้นคือ SET ON HTTPCLIENT เพื่อส่งคำขอทุกครั้งไปยังเซิร์ฟเวอร์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.