2013-09-26 148 views
15

Tôi đang tạo một HttpUrlConnection và cần đặt nhiều tiêu đề tùy chỉnh.Ký tự không hợp lệ trong tiêu đề HTTP

Tôi muốn làm điều gì đó dọc theo các dòng sau, nhưng nội dung của bản đồ đầu trang cần phải đến từ một chuỗi đơn. Có bất kỳ ký tự nào là bất hợp pháp hoặc cực kỳ hiếm khi được sử dụng trong cả hai tên tiêu đề HTTP và các giá trị tiêu đề HTTP không?

HashMap<String, String> headers = new HashMap<String, String>(); 

// TODO: How can I fill the headers map reliably from a single string? 

HttpURLConnection c = (HttpURLConnection) url.openConnection(); 
for(Map.Entry<String, String> e : headers.entrySet()) 
    c.setRequestProperty(e.getKey(), e.getValue()); 

Giải pháp cho bây giờ

Không có vẻ giống như bất kỳ HTTP tên tiêu đề chứa bất kỳ không gian (thường sử dụng dấu gạch ngang để thay thế?), Vì vậy tôi có thể tách tên với giá trị sử dụng một không gian duy nhất. Đối với các bộ tên-giá trị, có vẻ như tôi đã hơi say vì giá trị có thể chứa khá nhiều thứ theo câu trả lời đã cho. Vì vậy, tôi vừa chọn một nhân vật mà tôi chắc chắn rất có thể sẽ không bao giờ được sử dụng: §. Nếu nó quay ra nó thực sự cần thiết, tôi sẽ chỉ phải điều chỉnh mã của tôi: p

Header1 Value1§Header2 Value2§Header3 Header3 
+0

Xem tại đây: http://stackoverflow.com/questions/4400678/http-header-should-use-what-character-encoding –

Trả lời

8

[Câu trả lời được chấp nhận từ @ Stephen-c là sai đáng kể, vì vậy nó có vẻ đáng giá để sửa hồ sơ, mặc dù . câu hỏi đang được khá cũ]

các BNF có liên quan từ RFC7230 là:

field-name = token 

token = 1*tchar 

tchar = "!"/"#"/"$"/"%"/"&"/"'"/"*"/"+"/"-"/
     "."/"^"/"_"/"`"/"|"/"~"/DIGIT/ALPHA 

các ký tự có thể nhìn thấy USASCII.

RFC 7230 gần đây hơn câu hỏi của bạn, nhưng trong các chi liên quan, nó không thay đổi gì được chính thức nói bởi RFC 2616.

Có một quy ước rất mạnh cho tên trường mà có nhiều hạn chế hơn những gì RFC cho phép và điều này được thực thi theo các mức độ khác nhau trong các triển khai khác nhau. Tên trường thường theo một mẫu của một chuỗi các từ [ASCII/NUMERAL] với chữ cái đầu tiên (chỉ) của mỗi từ được viết hoa. Các từ được phân tách bằng một dấu nối đơn.

Vì vậy, ví dụ "HttpUrlConnection" được cho là một tên Tiêu đề HTTP (thay vì mã thông báo java), bạn sẽ gọi nó là 'Http-Url-Connection'.

Tôi rất nhớ khi theo dõi lỗi xuống một số triển khai đủ nghiêm ngặt để không thừa nhận nhiều thủ đô trong một từ (đã xảy ra là từ viết tắt). I E. nó trả tiền để làm theo định dạng này bị hạn chế hơn rất nghiêm ngặt.

@ Stephen-c là sai ở chỗ:

  • ISO-8859-1 đóng không tham gia vào lĩnh vực tên, mặc dù nó có thể được sử dụng trong các giá trị trường.

  • Vấn đề thoát trong tên trường không phải là âm u. Nó không được hỗ trợ bởi tiêu chuẩn.

  • https://bugzilla.mozilla.org/show_bug.cgi?id=601933 liên quan đến một trường cụ thể giá trị triển khai, không phải là tên trường.