代码之家  ›  专栏  ›  技术社区  ›  Josh Laird

将查询添加到已带有问号的URL

  •  1
  • Josh Laird  · 技术社区  · 6 年前

    通过良好的设计,如果URL中已经有问号的话,那么reformation将把你的查询添加到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
    

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

    注意双精度 ? 在里面 ?sign.get?site .

    1 回复  |  直到 6 年前
        1
  •  1
  •   Macmist    6 年前

    这样的网址可以接受吗?

    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”将不会被打印。

    作为最后的手段,如果上面的任何一个都不起作用,您可以尝试改用revolution中的@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");