今天,简单讲讲Android的http使用cookie请求。
现在,做一个功能,出现一个奇怪现象,就是老是登陆成功后,发送请求获取消息,老是提示我没有登陆。我自己都不知道是什么原因,这个也是我对网络通信这块不了解。请教了其他大神后,终于知道是请求没有加cookie的问题。这里记录一下。
Request经常都要携带Cookie,上面说过request创建时可以通过header设置参数,Cookie也是参数之一。就像下面这样:
Request request = new Request.Builder() .url(url) .header("Cookie", "xxx") .build();
然后可以从返回的response里得到新的Cookie,你可能得想办法把Cookie保存起来。
但是OkHttp可以不用我们管理Cookie,自动携带,保存和更新Cookie。
方法是在创建OkHttpClient设置管理Cookie的CookieJar
private final HashMap<String, List<Cookie>> cookieStore = new HashMap<>(); OkHttpClient okHttpClient = new OkHttpClient.Builder() .cookieJar(new CookieJar() { @Override public void saveFromResponse(HttpUrl httpUrl, List<Cookie> list) { cookieStore.put(httpUrl.host(), list); } @Override public List<Cookie> loadForRequest(HttpUrl httpUrl) { List<Cookie> cookies = cookieStore.get(httpUrl.host()); return cookies != null ? cookies : new ArrayList<Cookie>(); } }) .build();
这样就可以解决cookie的问题了,很感谢写这篇文章的人。参考文章:https://www.cnblogs.com/ganchuanpu/p/8075859.html
我继续把我的工具类代码贴出来:
package com.example.mayn.liushulogindemo.constans; import java.io.IOException; import java.net.URLEncoder; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import okhttp3.Call; import okhttp3.Callback; import okhttp3.Cookie; import okhttp3.CookieJar; import okhttp3.HttpUrl; import okhttp3.Interceptor; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.RequestBody; /** * Created by mayn on 2019/2/12. */ public class HttpUtils { /** * 为HttpGet 的 url 方便的添加多个name value 参数。 * * @param url * @param params * @return */ public static String attachHttpGetParams(String url, LinkedHashMap<String, String> params) { Iterator<String> keys = params.keySet().iterator(); Iterator<String> values = params.values().iterator(); StringBuffer stringBuffer = new StringBuffer(); stringBuffer.append("?"); for (int i = 0; i < params.size(); i++) { String value = null; try { value = URLEncoder.encode(values.next(), "utf-8"); } catch (Exception e) { e.printStackTrace(); } stringBuffer.append(keys.next() + "=" + value); if (i != params.size() - 1) { stringBuffer.append("&"); } } return url + stringBuffer.toString(); } public static void HTTP_GET(String url, Callback callback) { //1.创建OkHttpClient对象 // OkHttpClient okHttpClient = new OkHttpClient(); //2.创建Request对象,设置一个url地址(百度地址),设置请求方式。 Request request = new Request.Builder().url(url).method("GET", null).build(); //3.创建一个call对象,参数就是Request请求对象 Call call = okHttpClient.newCall(request); //4.请求加入调度,重写回调方法 call.enqueue(callback); } public static void HTTP_POST(String url, RequestBody requestBody, Callback callback) { //1.创建OkHttpClient对象 // OkHttpClient okHttpClient = new OkHttpClient(); //2.通过new FormBody()调用build方法,创建一个RequestBody,可以用add添加键值对 //3.创建Request对象,设置URL地址,将RequestBody作为post方法的参数传入 Request request = new Request.Builder().url(url).post(requestBody).build(); //4.创建一个call对象,参数就是Request请求对象 Call call = okHttpClient.newCall(request); //5.请求加入调度,重写回调方法 call.enqueue(callback); } private static final HashMap<String, List<Cookie>> cookieStore = new HashMap<>(); private static OkHttpClient okHttpClient = new OkHttpClient.Builder() .cookieJar(new CookieJar() { @Override public void saveFromResponse(HttpUrl httpUrl, List<Cookie> list) { cookieStore.put(httpUrl.host(), list); } @Override public List<Cookie> loadForRequest(HttpUrl httpUrl) { List<Cookie> cookies = cookieStore.get(httpUrl.host()); return cookies != null ? cookies : new ArrayList<Cookie>(); } }) .build(); }
android okhttp使用cookie请求就讲完了。
就这么简单。