为什么Retrofit会忽略我的网址请求中的某些字符?

时间:2017-06-23 20:31:41

标签: java android http web retrofit

更新 NOT 问题与需要对网址进行编码有关。这是由Retrofit完成的。如果我对URL进行编码,然后将其传递给Retrofit,则URL会被编码两次,最终看起来像这样:

https://example.com/api/get_user_info/?id=12345&cookie=user@email.com%257C1492357107%257CfyVzRUYC9h%257C4f889e1976c2cd87aac

请注意%257C。第一轮是| -> %7C。第二轮是%7C -> %257C

我正在尝试使用Retrofit执行HTTP GET请求。请求如下所示: https://example.com/api/get_user_info/?id=12345&cookie=user@email.com|1492357107|fyVzRUYC9h|4f889e1976c2cd87aac

在代码中,调用看起来像这样

@GET("get_user_info")
Call<ResponseBody> getUserMeta(
            @Query("id") int userId,
            @Query("cookie") String cookie
);

执行此查询时,Request如下所示:

Request{method=GET, url=https://example.com/api/get_user_info/?id=12345&cookie=user@email.com|1492357107|fyVzRUYC9h|4f889e1976c2cd87aac, tag=null}

(记录call.request().toString()后从控制台获取)

执行调用后,我收到来自API的错误,指出cookie无效。响应如下:

Response{protocol=h2, code=404, message=, url=https://example.com/api/get_user_info/?id=12345&cookie=user@email.com1492357107fyVzRUYC9h4f889e1976c2cd87aac}

(在登录Response<ResponseBody> response.toString()之后从控制台获取)

如您所见,这两个网址不一样。不知何故,|字符已从响应URL中的cookie参数中删除。

您可能认为这与我的API有关,而且Cookie实际上是错误的,但是如果我将Request网址直接复制并粘贴到我的浏览器中,它就会执行而没有错误(状态200)。如果Retrofit执行调用,我会得到404。

显然,Retrofit正在执行第二个错误的网址。这显然是这种情况,因为第一个URL在浏览器中执行时不会返回404,但第二个URL会返回。

发生了什么事?任何帮助将不胜感激。

其他信息:

我在app模块的build.gradle中使用compile 'com.squareup.retrofit2:retrofit:2.2.0'

我正在实例化我的Retrofit客户端:

Retrofit retroFit = new Retrofit.Builder()
                    .baseUrl("https://example.com/api/")
                    .build();

1 个答案:

答案 0 :(得分:2)

您应该在Cookie上实施encoding

@FormUrlEncoded
@GET("get_user_info")
Call<ResponseBody> getUserMeta(
    @Query("id") int userId,
    @Query(value ="cookie", encode = true) String cookie

    );