使用Retrofit向已经带有问号的URL添加查询

时间:2018-10-05 16:28:36

标签: kotlin retrofit2

通过良好的设计,如果URL中已经存在问号,则Retrofit会将查询添加为与号而不是问号的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>
}

打印的网址:

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 :(得分:1)

这样的网址可以接受吗?

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

这次&将在问号之前,但不确定是否可以使用。另外,第二种解决方案要求您永远不要为调用的site参数传递null,否则将不会打印“?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作为参数发送。