2014-09-30 17 views
5

Uso Retrofit per il mio livello di rete nella mia app per Android, ma ho un problema con la codifica dell'URL.Perché Retrofit non può codificare correttamente la stringa di query con parentesi quadre?

devo chiamare un'API REST del genere:

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

come si può vedere la stringa di query è composta da alcuni diversi tipi di parametri, così ho deciso di usare il @QueryMap annotazioni nell'interfaccia Retrofit con a Map<String, String> dove q, param[1], param[0], other_param sono chiavi stringa della mappa

Cosa mi aspetto? Mi aspetto che le parentesi quadre nell'URL siano codificate con per '[' e %5D per '[', ma ciò non accade.

Perché succede? Le parentesi quadre dovrebbero essere codificate con la codifica percentuale. È un bug o sto facendo qualcosa di sbagliato? Ho anche provato l'annotazione @EncodedQueryMap senza differenze.

+0

che assomiglia il tuo api resto dovrebbe essere in attesa 'params' di essere un array di valori – njzk2

+0

penso che il server riposo non dovrebbe usare' [] ' in nomi di variabili, ma piuttosto usarlo come ovunque, come indicatore di lista, nel qual caso non è necessario che le parentesi siano codificate. – njzk2

+0

Senza codificare la parentesi l'API del server non funziona correttamente. Ho bisogno di codificare le parentesi, ma mi piacerebbe sapere come farlo con il retrofit e non manualmente. – Noodles

risposta

13

I nomi delle query non sono mai codificati URL.

La documentazione per @QueryMap stati:

I valori sono URL codificato.

E per @EncodedQueryMap:

I valori non sono URL codificato.

Tuttavia, ho appena submitted a pull request modificare questo comportamento un po '. Sto aggiungendo il supporto per le chiavi di codifica usando @Query(value = "..", encodeName = true) o @QueryMap(encodeNames = true).

+0

Questo ha risolto il mio caso, non voglio codificare il valore della query, quindi ho impostato invece @Query (value = "..", encodeValue = false) –

1

Prova semplice @GET e parametri @query

+0

clean & simple. –