2016-12-01 14 views
5

Tôi có ứng dụng khởi động vào mùa xuân bằng vênh. Khi tôi đang thử nghiệm các dịch vụ còn lại của tôi không có ký tự utf-8 trong tiêu đề, mọi thứ hoạt động OK. Swagger tạo lệnh mà tôi có thể sử dụng để kiểm tra:Phản hồi không tải khi sử dụng các ký tự utf-8 trong tiêu đề với phần còn lại khởi động vào mùa xuân và Swagger

curl -X GET --header 'Accept: application/json' --header 'user: me' --header 'reason: zst' --header 'Authorization: Basic dG9tYXM6dG9tYXMxMjM=' 'http://localhost:8080/my-app/uuid/756531B55A3D029A0894D7C9C4ACDF3EC0' 

nhưng khi tôi đang sử dụng ký tự utf-8 trong vung tôi không nhận được phản hồi. Swagger chỉ đang tải thứ gì đó. Khi tôi xem xét giao diện điều khiển của firefox, tôi chỉ thấy một số yêu cầu nhận được:

http://localhost:8080/my-app/webjars/springfox-swagger-ui/images/throbber.gif 

không phản hồi.

Khi tôi cố gắng chỉnh sửa curl lệnh trên:

curl -X GET --header 'Accept: application/json' --header 'user: me' --header 'reason: žšť' --header 'Authorization: Basic dG9tYXM6dG9tYXMxMjM=' 'http://localhost:8080/my-app/uuid/756531B55A3D029A0894D7C9C4ACDF3EC0' 

mọi thứ hoạt động OK vì vậy tôi đoán không có vấn đề với backend của tôi. Có cách nào làm thế nào tôi có thể sửa chữa/gỡ lỗi vấn đề này?

Trả lời

3

Theo RFC 2616 section 4, nhắn Headers được định nghĩa như sau:

message-header = field-name ":" [ field-value ] 
field-name  = token 
field-value = *(field-content | LWS) 
field-content = <the OCTETs making up the field-value 
       and consisting of either *TEXT or combinations 
       of token, separators, and quoted-string> 

Biết rằng theo section 2:

token   = 1*<any CHAR except CTLs or separators> 
separators  = "(" | ")" | "<" | ">" | "@" 
        | "," | ";" | ":" | "\" | <"> 
        | "/" | "[" | "]" | "?" | "=" 
        | "{" | "}" | SP | HT 
CHAR   = <any US-ASCII character (octets 0 - 127)> 
quoted-string = (<"> *(qdtext | quoted-pair) <">) 
qdtext   = <any TEXT except <">> 

Nguyên tắc TEXT chỉ được sử dụng cho lĩnh vực mô tả nội dung và giá trị không nhằm mục đích giải thích bằng trình phân tích cú pháp thư. Từ của * TEXT CHỈ có thể chứa các ký tự từ các bộ ký tự khác ngoài ISO-8859-1 chỉ khi được mã hóa theo các quy tắc của RFC 2047.

TEXT   = <any OCTET except CTLs, 
       but including LWS>  

Nói cách khác, giá trị của một tiêu đề chỉ có thể được ISO-8859-1 mã hóa, nếu bạn muốn mã hóa ký tự không được đưa vào charset này mà dường như là trường hợp ở đây, bạn sẽ được phải mã hóa nó theo RFC 2047 còn được gọi là MIME (Phần mở rộng thư Internet đa năng) Phần ba: Tiện ích tiêu đề thư cho văn bản không phải ASCII.

Vì vậy, thay vì

reason: žšť 

Nó phải là

reason: =?utf-8?q?=C5=BE=C5=A1=C5=A5?= 

Trong thực tế, nó thậm chí còn khuyến khích để mã hóa các giá trị khi bạn không có chỉ US-ASCII ký tự.

Điều cuối cùng để kiểm tra về phía bạn, là nếu thực hiện JAX-RS của bạn hỗ trợ ra khỏi hộp các RFC 2047, nếu không bạn sẽ cần phải giải mã nó bằng tay ví dụ bằng cách sử dụng phương pháp hữu ích MimeUtility.decodeText(String etext).

Đây là một ví dụ cụ thể:

@GET 
public Response showHeader(@HeaderParam("reason") String reason) 
    throws UnsupportedEncodingException { 
    // Decode it 
    reason = MimeUtility.decodeText(reason); 
    // Return the value of the decoded String 
    return Response.status(Response.Status.OK) 
     .entity(String.format("Value of reason = '%s'", reason)) 
     .build(); 
} 

gọi method cập khu vực này sử dụng curl với --header 'reason: =?utf-8?q?=C5=BE=C5=A1=C5=A5?=' cho như mong đợi:

Value of reason = 'žšť' 

NB: Để mã hóa tiêu đề của bạn giá trị từ js của bạn front-end, bạn có thể sử dụng thư viện q-encoding, đây là live demo.

+0

thx người đàn ông câu trả lời hay. Tôi sẽ nhận phần thưởng của bạn càng sớm càng tốt. Chỉ một câu hỏi nữa. Như lối vào, chúng tôi đang sử dụng góc cạnh. Có một số phương pháp có thể mã hóa văn bản này theo RFC bạn đề cập ở trên? – hudi

+0

Bạn đã thử [this] (https://github.com/mathiasbynens/q-encoding) chưa? –

+0

chưa thx để biết mẹo – hudi

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