添加cookie以改进2请求

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标头,因此无法对单独的值(示例中的sessionidtoken)使用两个@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)


Sam*_*Sam 5

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)