Sta*_*olm 14 cookies android retrofit retrofit2
我需要在改装2.0中添加cookie.如果我理解正确,cookie - 与标题相同.必须添加此Cookie:
private HashMap<String, String> cookies = new HashMap();
cookies.put("sessionid", "sessionId");
cookies.put("token", "token");
Run Code Online (Sandbox Code Playgroud)
这个与Jsoup lib一起使用:
String json = Jsoup.connect(apiURL + "/link")
.cookies(cookies)
.ignoreHttpErrors(true)
.ignoreContentType(true)
.execute()
.body();
Run Code Online (Sandbox Code Playgroud)
这是我的代码与改造请求:
@GET("link")
Call<CbGet> getData(@Header("sessionid") String sessionId, @Header("token") String token);
Run Code Online (Sandbox Code Playgroud)
但它不起作用...我得到403错误代码,所以请求中没有cookie ...
任何的想法?
Ale*_*nov 39
首先:cookie与标题不同.Cookie是一个名为Cookie的特殊HTTP标头,后跟键和值对的列表(以";"分隔).就像是:
Cookie: sessionid=sessionid; token=token
Run Code Online (Sandbox Code Playgroud)
由于您无法在同一请求中设置多个Cookie标头,因此无法对单独的值(示例中的sessionid和token)使用两个@Header注释.我可以想到一个非常hacky的解决方法:
@GET("link")
Call<CbGet> getData(@Header("Cookie") String sessionIdAndToken);
Run Code Online (Sandbox Code Playgroud)
您更改方法以在一个字符串中发送sessionId和token.所以在这种情况下,您应该事先手动生成cookie字符串.在您的情况下,sessionIdAndToken String对象应该等于"sessionid = here_goes_sessionid ; token = here_goes_token "
的适当的溶液是通过将设定Cookie OkHttp的(即库改造使用用于制备底层HTTP调用)请求的拦截.你可以看到溶液或添加自定义页眉这里.
小智 16
为什么不使用 cookieJar 选项?
new Retrofit.Builder()
.baseUrl(BASE_URL)
.client(
new OkHttpClient().newBuilder()
.cookieJar(new SessionCookieJar()).build())
.build();
private static class SessionCookieJar implements CookieJar {
private List<Cookie> cookies;
@Override
public void saveFromResponse(HttpUrl url, List<Cookie> cookies) {
if (url.encodedPath().endsWith("login")) {
this.cookies = new ArrayList<>(cookies);
}
}
@Override
public List<Cookie> loadForRequest(HttpUrl url) {
if (!url.encodedPath().endsWith("login") && cookies != null) {
return cookies;
}
return Collections.emptyList();
}
}
Run Code Online (Sandbox Code Playgroud)
API Web 服务示例添加标头
@FormUrlEncoded
@POST("getDriverRoutes")
Call<Guzergah> getGuzergah(@Header("Cookie") String userCookie, @Field("driver_id") int driver_id);
Run Code Online (Sandbox Code Playgroud)
当您登录系统时,将 cookie 保存到您本地的响应中,例如
public void onResponse(Response<Login> response, Retrofit retrofit) {
hidepDialog();
String cookie = response.headers().get("Set-Cookie");
editor.putString("user_cookie", cookie.split(";")[0]);
editor.commit();
Run Code Online (Sandbox Code Playgroud)
在每项服务中,您都需要自动发送您的cookie,从共享首选项中获取并通过您的网络服务发送它
String userCookie = shp.getString("user_cookie", ""); // here is cookies before send
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://server.aracadabra.com:8080/").
addConverterFactory(GsonConverterFactory.create())
.build();
final APIService service = retrofit.create(APIService.class);
final Call<SenMsgStatus> loginMCall = service.sendMessage(userCookie, type, route_id, user_id, passenger_id, passenger_status, text);
Run Code Online (Sandbox Code Playgroud)