今天,简单讲讲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() {@Overridepublic void saveFromResponse(HttpUrl httpUrl, List<Cookie> list) {cookieStore.put(httpUrl.host(), list);}@Overridepublic 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() {@Overridepublic void saveFromResponse(HttpUrl httpUrl, List<Cookie> list) {cookieStore.put(httpUrl.host(), list);}@Overridepublic List<Cookie> loadForRequest(HttpUrl httpUrl) {List<Cookie> cookies = cookieStore.get(httpUrl.host());return cookies != null ? cookies : new ArrayList<Cookie>();}}).build();}

android okhttp使用cookie请求就讲完了。

就这么简单。

android okhttp使用cookie请求相关推荐

  1. android网络请求撤销,Android OkHttp + Retrofit 取消请求的方法

    前言 在某一个界面,用户发起了一个网络请求,因为某种原因用户在网络请求完成前离开了当前界面,比较好的做法是取消这个网络请求.对于OkHttp来说,具体是调用Call的cancel方法. 如何找到这一个 ...

  2. Android—OkHttp同步异步请求过程源码分析与拦截器

    OkHttp同步请求步骤: 创建OkHttpClient,客户对象 创建Request,请求主体,在请求主体设置请求的url,超时时间等 用newCall(request)将Reuqest对象封装成C ...

  3. android 设置允许http请求_网络请求框架----OkHttp原理

    一.前言 在 Android 中,网络请求是一个必不可少的功能,因此就有许多代表网络请求客户端的组件库,具有代表性的有下面三种: Apache 的 HTTP 客户端组件 HttpClient. Jav ...

  4. Android okHttp网络请求之缓存控制Cache-Control

    前言: 前面的学习基本上已经可以完成开发需求了,但是在项目中有时会遇到对请求做个缓存,当没网络的时候优先加载本地缓存,基于这个需求我们来学习一直okHttp的Cache-Control. okHttp ...

  5. 详解 Android okhttp 网络请求get,post传输数据的基本用法

    官网网址:http://square.github.io/okhttp/ github地址:https://github.com/square/okhttp OKHttp优点 1.支持HTTP2/SP ...

  6. 一个整合OkHttp 、Retrofit 、Volley 、RxJava、Novate多种开源网络框架的项目,高度的封装和集成,Android中Web网络请求一行代码解决

    一个整合OkHttp .Retrofit .Volley .RxJava.Novate多种开源网络框架的项目,高度的封装和集成,Android中Web网络请求一行代码解决 AndroidHttp 一个 ...

  7. Android OkHttp框架解析

    Okhttp是由Sqare公司开发的开源网络访问库,是目前比较火的网络框架, 它处理了很多网络疑难杂症:会从很多常用的连接问题中自动恢复.如果你的服务器配置了多个IP地址,当第一个IP连接失败的时候, ...

  8. Android OkHttp完全解析 是时候来了解OkHttp了

    Android OkHttp完全解析 是时候来了解OkHttp了 标签: AndroidOkHttp 2015-08-24 15:36 316254人阅读 评论(306) 收藏 举报  分类: [an ...

  9. Android OkHttp 源码解析 - 拦截器

    一.前言 看一下 RealCall 中的拦截器排序: Response getResponseWithInterceptorChain() throws IOException {// Build a ...

最新文章

  1. Android选项卡置底的方法
  2. VisualStudioCode下载安装与安装中文插件教程(图文教程)
  3. Spring Boot集成Thymeleaf模板引擎
  4. C 程序的存储空间记录
  5. 龙芯发布.NET 6.0.100开发者内测版
  6. Kubernetes tutorial - K8S 官方入门教程
  7. 使用SQL Server存储ASP.NET Session变量
  8. sql中根据逗号分隔,查出多行数据
  9. Java基础:Collections集合、Map集合综合案例 —— 斗地主
  10. Linux下conda 安装以后 activate无法使用
  11. mac navicat 安装
  12. 2016 年全国房价会呈什么趋势?
  13. 七战DTCC铸成ACE Director 去哪儿网周彦伟畅聊数据库的十八般武艺
  14. WinEdit初使用
  15. yd什么意思_excel中yd是什么意思
  16. CATransform3D 矩阵 m11–m44每个的含义
  17. 当阿里云服务器 ECS 访问不了公网 ip可能存在的原因以及如何解决的办法
  18. matlab mag函数,频谱分析函数
  19. 小车红外线自主充电方案-2
  20. 一元二次方程java实现代码

热门文章

  1. python--装饰器(附偏函数、断言)
  2. Mina2中IoService
  3. Node.Js同步mongdb数据
  4. 2.12日递推专题第一题
  5. Windows - 通过注册表编辑器来删除多余盘符
  6. 08. 函数和流程控制
  7. pb - unable to initialize client library context
  8. 引用类型传递参数的特殊情况(string)
  9. Java数字图像处理基础知识 - 必读
  10. 在线rss阅读聚合器lilina-0.7安装笔记