2014-09-30 9 views
5

Używam Retrofit dla mojej warstwy sieciowej w mojej aplikacji na Androida, ale mam problem z kodowaniem URL.Dlaczego funkcja Retrofit nie może poprawnie kodować ciągu zapytania za pomocą nawiasów kwadratowych?

Muszę zadzwonić API REST tak:

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

jak widać łańcuch zapytania składa się za pośrednictwem różnego rodzaju parametrów, więc postanowiłem użyć @QueryMap adnotacji w interfejsie modernizacyjny z a Map<String, String> gdzie q, param[1], param[0], other_param to Klucze łańcuchowe mapy

Czego oczekuję? Spodziewam się, że nawiasy kwadratowe w adresie URL są kodowane %5B dla '[' i %5D dla '[', ale tak się nie stanie.

Dlaczego tak się dzieje? Nawiasy kwadratowe powinny być zakodowane za pomocą kodowania procentowego. Czy to błąd, czy robię coś nie tak? Próbowałem też adnotacji @EncodedQueryMap bez żadnych różnic.

+0

że wygląda jak API REST należy spodziewa 'params' być tablicą wartości – njzk2

+0

myślę serwer reszta nie powinna być za pomocą' [] ' w nazwach zmiennych, ale używaj tego, jak wszędzie indziej, jako wskaźnika listy, w którym to przypadku nawiasy nie powinny być zakodowane. – njzk2

+0

Bez kodowania nawiasu interfejs API serwera nie działa poprawnie. Muszę zakodować nawiasy, ale chciałbym wiedzieć, jak to zrobić z modernizacją, a nie ręcznie. – Noodles

Odpowiedz

13

Nazwy zapytań nigdy nie są kodowane za pomocą adresu URL.

Dokumentacja dla @QueryMap stany:

wartości są zakodowane URL.

I @EncodedQueryMap:

Wartości nie są zakodowane URL.

Jednak, po prostu submitted a pull request, aby zmienić to zachowanie nieco. Dodaję obsługę kodowania kluczy za pomocą @Query(value = "..", encodeName = true) lub @QueryMap(encodeNames = true).

+0

To rozwiązało moją sprawę, nie chcę zakodować wartości zapytania, więc ustawiłem zamiast tego @Query (value = "..", encodeValue = false) –

1

Spróbuj prosta @GET i parametry @query

+0

czyste i proste. –

Powiązane problemy