更新: NOT 问题与需要对网址进行编码有关。这是由Retrofit完成的。如果我对URL进行编码,然后将其传递给Retrofit,则URL会被编码两次,最终看起来像这样:
请注意%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();
答案 0 :(得分:2)
您应该在Cookie上实施encoding
:
@FormUrlEncoded
@GET("get_user_info")
Call<ResponseBody> getUserMeta(
@Query("id") int userId,
@Query(value ="cookie", encode = true) String cookie
);