Добавление запроса к URL-адресу, на котором уже есть вопросительный знак, с помощью Retrofit - PullRequest
0 голосов
/ 05 октября 2018

При хорошем дизайне Retrofit добавит ваш запрос в ваш URL как амперсанд, а не как вопросительный знак, если в URL уже есть вопросительный знак.Тем не менее, я не контролирую URL и не могу его изменить.Есть ли способ, которым я могу переопределить @Query, чтобы вместо него использовался ??

interface Service {
    @GET("/php/project/?sign.externalGetToken")
    fun getAuthToken(
        @Query("site") site: String,
        @Query("time") time: String,
        @Query("secretkey") secretKey: String
    ): Call<TokenResponse>
}

Печатный URL:

http://baseurl.com/php/project/?sign.get&site=my_site&time=1538755984978&secretkey=site_secret_key

Мне нужно, чтобы этот URL был:

http://baseurl.com/php/project/?sign.get?site=my_site&time=1538755984978&secretkey=site_secret_key

Обратите внимание на двойной ? в ?sign.get?site.

1 Ответ

0 голосов
/ 06 октября 2018

Допустим ли такой URL-адрес?

http://baseurl.com/php/project/?sign.get?&site=my_site&time=1538755984978&secretkey=site_secret_key

Сразу после второго знака вопроса стоит знак &, но теоретически сервер все еще должен его прочитать.Если да, вы можете сделать это просто так:

@GET("/php/project/?sign.externalGetToken?")

Или вы также можете попробовать так:

@GET("/php/project/?sign.externalGetToken")
fun getAuthToken(
    @Query(value = "?site", encoded = true) site: String, // encoded ensure that retrofit doesn't encode the ? into '%3F'
    @Query("time") time: String,
    @Query("secretkey") secretKey: String
): Call<TokenResponse>

, что приведет к

http://baseurl.com/php/project/?sign.get&?site=my_site&time=1538755984978&secretkey=site_secret_key

& будет на этот раз до вопросительного знака, но не уверен, будет ли он работать.Также это второе решение требует, чтобы вы никогда не передавали значение null для параметра site вашего вызова, иначе «? Site» просто не будет напечатан.

В качестве крайней меры, если ничего из вышеперечисленного не работает, вы можете попробоватьиспользовать вместо аннотации @Url от модернизации.Кажется, это немного противоречит использованию сервисного интерфейса, если вы спросите меня, но, по крайней мере, он должен работать.Просто замените ваше объявление следующим:

@GET
fun getAuthToken(
    @Url url: String,
    @Query("time") time: String,
    @Query("secretkey") secretKey: String
): Call<TokenResponse>

, затем просто назовите его следующим образом:

service.getAuthToken("/php/project/?sign.externalGetToken?site="+ yourSite, yourTimeString, yourSecretKey");

, и вы получите URL, который хотите.Но для этого необходимо всегда отправлять URL в качестве параметра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...