通过良好的设计,如果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
。
答案 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作为参数发送。