2014-09-30 17 views
5

Tôi đang sử dụng trang bị Thêm cho lớp mạng của mình trong ứng dụng Android, nhưng tôi gặp sự cố với mã hóa URL.Tại sao Retrofit không thể mã hóa chuỗi truy vấn đúng với dấu ngoặc vuông?

tôi phải gọi một API REST như thế:

https://my_hostname.com/some_path?q=some_query&param[0]=value1&param[1]=value2&other_param=abcd 

như bạn sẽ nhìn thấy chuỗi truy vấn được sáng tác bởi một số loại khác nhau của các thông số, vì vậy tôi quyết định sử dụng @QueryMap chú thích trong giao diện với Retrofit a Map<String, String> trong đó q, param[1], param[0], other_param là các phím chuỗi của bản đồ

Tôi mong đợi điều gì? Tôi hy vọng các dấu ngoặc vuông trong URL được mã hóa với %5B cho '['%5D cho '[', nhưng điều này không xảy ra.

Tại sao điều này lại xảy ra? Dấu ngoặc vuông phải được mã hóa bằng mã hóa phần trăm. Đây có phải là một lỗi hoặc tôi đang làm điều gì sai? Tôi cũng đã thử chú thích @EncodedQueryMap mà không có sự khác biệt.

+0

trông giống như api phần còn lại của bạn nên được kỳ vọng 'params' là một mảng các giá trị – njzk2

+0

tôi nghĩ rằng máy chủ còn lại của bạn không nên sử dụng '[]' trong các tên biến, nhưng thay vì sử dụng nó ở mọi nơi khác, như một chỉ báo danh sách, trong trường hợp đó các dấu ngoặc không cần phải được mã hóa. – njzk2

+0

Nếu không mã hóa khung, API máy chủ sẽ không hoạt động chính xác. Tôi cần phải mã hóa các dấu ngoặc, nhưng tôi muốn biết làm thế nào để làm điều đó với trang bị thêm, và không phải bằng tay. – Noodles

Trả lời

13

Tên truy vấn không bao giờ được mã hóa URL.

Các tài liệu cho @QueryMap trạng thái:

Giá trị là URL được mã hóa.

Và đối với @EncodedQueryMap:

Các giá trị được không URL được mã hóa.

Tuy nhiên, tôi chỉ submitted a pull request để thay đổi hành vi này một chút. Tôi đang thêm hỗ trợ cho các khóa mã hóa bằng cách sử dụng @Query(value = "..", encodeName = true) hoặc @QueryMap(encodeNames = true).

+0

Điều này đã giải quyết trường hợp của tôi, tôi không muốn mã hóa giá trị truy vấn, vì vậy tôi đặt thay vì @Query (value = "..", encodeValue = false) –

1

Hãy thử đơn giản một @GET và các thông số @Query

+0

sạch sẽ và đơn giản. –

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