2011-07-30 44 views
6

Tôi đang gửi nhiều yêu cầu HTTP qua DefaultHttpClient. Vấn đề là tiêu đề "Máy chủ" không bao giờ được đặt trong yêu cầu. Ví dụ bằng cách thực hiện các yêu cầu GET sau:Java - DefaultHttpClient và "Máy chủ" tiêu đề [Apache HttpComponent]

HttpUriRequest request = new HttpGet("http://www.myapp.com"); 
org.apache.http.client.HttpClient client = new DefaultHttpClient(); 
HttpResponse httpResponse = client.execute(request); 

Đối tượng yêu cầu được tạo ra không thiết lập bắt buộc "chủ nhà" tiêu đề với giá trị:

Host: myapp.com 

Bất cứ lời khuyên?

Trả lời

8

Lỗi của tôi. Trên thực tế, DefaultHttpClient làm thêm tiêu đề Host, theo yêu cầu của đặc tả HTTP.

Sự cố của tôi là do tiêu đề tùy chỉnh khác mà tôi đã thêm trước khi giá trị của nó kết thúc bằng "\r\n". Điều này đã vô hiệu hóa tất cả tiêu đề tiếp theo được thêm tự động bởi DefaultHttpClient. tôi đang làm một cái gì đó như:

HttpUriRequest request = new HttpGet("http://www.myapp.com"); 
org.apache.http.client.HttpClient client = new DefaultHttpClient(); 
request.addHeader(new BasicHeader("X-Custom-Header", "Some Value\r\n"); 
HttpResponse httpResponse = client.execute(request); 

đã tạo ra chuỗi Tiêu đề sau đây trong yêu cầu HTTP:

GET /index.html HTTP/1.1 
X-Custom-Header: Some value 

Host: www.example.com 

Khoảng cách giữa X-Custom-HeaderHost không còn giá trị các Host tiêu đề. cố định với:

HttpUriRequest request = new HttpGet("http://www.myapp.com"); 
org.apache.http.client.HttpClient client = new DefaultHttpClient(); 
request.addHeader(new BasicHeader("X-Custom-Header", "Some Value"); 
HttpResponse httpResponse = client.execute(request); 

Đó tạo:

GET /index.html HTTP/1.1 
X-Custom-Header: Some value 
Host: www.example.com 
+1

Tốt bắt! Trong trường hợp của tôi (trên Android), tôi đã mã hóa Base64 một giá trị tiêu đề với ['Base64.DEFAULT'] (http://developer.android.com/reference/android/util/Base64.html#DEFAULT), bao gồm các thuật ngữ dòng . Kết quả là tất cả các cặp khóa-giá trị xuất hiện sau khi tiêu đề tùy chỉnh bị rối tung lên (thậm chí không thể nhìn thấy chúng khi chạy yêu cầu thông qua proxy). Chuyển sang ['Base64.NO_WRAP'] (http://developer.android.com/reference/android/util/Base64.html#NO_WRAP) đã giải quyết được vấn đề của tôi, vì nó bỏ qua tất cả các thuật ngữ dòng (tức là, đầu ra là một dòng dài). –

1

Chỉ cần đặt tiêu đề máy chủ theo yêu cầu sử dụng addHeader.

+0

Great câu trả lời. Tôi đã có thể đặt giá trị tùy chỉnh cho 'Máy chủ' và xác nhận rằng nó hoạt động bằng cách truy cập http://djce.org.uk/dumprequest. Trang đó đổ trở lại các tiêu đề mà nó nhận được, và chắc chắn đủ, giá trị của 'Host' là những gì tôi đặt nó (không phải' djce.org.uk', đó là giá trị Host nếu không thay đổi) . –

Các vấn đề liên quan