OkHttp协议

okhttp是一个第三方类库,用于android中请求网络
这是一个开源项目,是安卓端最火热的轻量级框架,由移动支付Square公司贡献(该公司还贡献了Picasso和LeakCanary)

文件下载用Get方式

 OkHttpClient okHttpClient = new OkHttpClient.Builder().callTimeout(5, TimeUnit.SECONDS).readTimeout(5, TimeUnit.SECONDS).build();Request request = new Request.Builder().url(u).get().build();Call call = okHttpClient.newCall(request);call.enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {}@Overridepublic void onResponse(Call call, Response response) throws IOException {ResponseBody body = response.body();long length = body.contentLength();Message message = Message.obtain();message.what = Model.DownLoad_Max;message.obj = (int)length;handler.sendMessage(message);InputStream inputStream = body.byteStream();FileOutputStream fileOutputStream = new FileOutputStream(path);byte[] bytes = new byte[1024];int len = 0;int count = 0;while ((len=inputStream.read(bytes))!=-1) {count+=len;fileOutputStream.write(bytes,0,len);Message message1 = Message.obtain();message1.what = Model.DownLoad_Progress;message1.obj = count;handler.sendMessage(message1);}}});

文件上传用Post方式

OkHttpClient okHttpClient = new OkHttpClient.Builder().readTimeout(5, TimeUnit.SECONDS).callTimeout(5, TimeUnit.SECONDS).build();MultipartBody multipartBody = new MultipartBody.Builder().setType(MultipartBody.FORM).addFormDataPart("file",filename, RequestBody.create(MediaType.parse("image/jpg"),new File(path))).build();Request request = new Request.Builder().url(u).post(multipartBody).build();Call call = okHttpClient.newCall(request);call.enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {}@Overridepublic void onResponse(Call call, Response response) throws IOException {handler.sendEmptyMessage(Model.UpLoad_Finish);}});

OkHttp协议封装

将OkHttp封装成工具类并写上传和下载方法,代码如下:

public static OkHttpClient okHttpClient;private static OkHttpUtils okHttpUtils = new OkHttpUtils();private OkHttpUtils(){}public static OkHttpUtils getOkHttpUtils(){okHttpClient = new OkHttpClient.Builder().callTimeout(5, TimeUnit.SECONDS).readTimeout(5,TimeUnit.SECONDS).build();return okHttpUtils;}public void get(String url, final CallBack callBack){Request request = new Request.Builder().get().url(url).build();Call call = okHttpClient.newCall(request);call.enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {callBack.onError(e.getMessage());}@Overridepublic void onResponse(Call call, Response response) throws IOException {callBack.onSuccess(response);}});}public void post(String url, HashMap<String,String> map, final CallBack callBack){Set<Map.Entry<String, String>> entries = map.entrySet();FormBody.Builder builder = new FormBody.Builder();for (Map.Entry<String, String> entrie : entries) {String key = entrie.getKey();String value = entrie.getValue();builder.add(key,value);}FormBody formBody = builder.build();Request request = new Request.Builder().post(formBody).url(url).build();Call call = okHttpClient.newCall(request);call.enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {callBack.onError(e.getMessage());}@Overridepublic void onResponse(Call call, Response response) throws IOException {callBack.onSuccess(response);}});}

OkHttp拦截器

主要用于拦截发送信息

public static OkHttpClient okHttpClient;private static OkHttpUtils okHttpUtils = new OkHttpUtils();private OkHttpUtils(){}public static OkHttpUtils getOkHttpUtils(){okHttpClient = new OkHttpClient.Builder().callTimeout(5, TimeUnit.SECONDS).readTimeout(5,TimeUnit.SECONDS).addInterceptor(httpLoggingInterceptor).addInterceptor(interceptor).build();return okHttpUtils;}static HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() {@Overridepublic void log(String message) {Log.d("###",message);}});static Interceptor interceptor = new Interceptor() {@Overridepublic Response intercept(Chain chain) throws IOException {Request request = chain.request().newBuilder().header("token", "token").build();return chain.proceed(request);}};

SpringBoot——集成Okhttp3

1.pom依赖:

<dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>3.10.0</version>
</dependency>

2.okhttp工具类:

public class OkHttpUtils {private static volatile OkHttpClient okHttpClient = null;private static volatile Semaphore semaphore = null;private Map<String, String> headerMap;private Map<String, String> paramMap;private String url;private Request.Builder request;/*** 初始化okHttpClient,并且允许https访问*/private OkHttpUtils() {if (okHttpClient == null) {synchronized (OkHttpUtils.class) {if (okHttpClient == null) {TrustManager[] trustManagers = buildTrustManagers();okHttpClient = new OkHttpClient.Builder().connectTimeout(15, TimeUnit.SECONDS).writeTimeout(20, TimeUnit.SECONDS).readTimeout(20, TimeUnit.SECONDS).sslSocketFactory(createSSLSocketFactory(trustManagers), (X509TrustManager) trustManagers[0]).hostnameVerifier((hostName, session) -> true).retryOnConnectionFailure(true).build();addHeader("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36");}}}}/*** 用于异步请求时,控制访问线程数,返回结果** @return*/private static Semaphore getSemaphoreInstance() {//只能1个线程同时访问synchronized (OkHttpUtils.class) {if (semaphore == null) {semaphore = new Semaphore(0);}}return semaphore;}/*** 创建OkHttpUtils** @return*/public static OkHttpUtils builder() {return new OkHttpUtils();}/*** 添加url** @param url* @return*/public OkHttpUtils url(String url) {this.url = url;return this;}/*** 添加参数** @param key   参数名* @param value 参数值* @return*/public OkHttpUtils addParam(String key, String value) {if (paramMap == null) {paramMap = new LinkedHashMap<>(16);}paramMap.put(key, value);return this;}/*** 添加请求头** @param key   参数名* @param value 参数值* @return*/public OkHttpUtils addHeader(String key, String value) {if (headerMap == null) {headerMap = new LinkedHashMap<>(16);}headerMap.put(key, value);return this;}/*** 初始化get方法** @return*/public OkHttpUtils get() {request = new Request.Builder().get();StringBuilder urlBuilder = new StringBuilder(url);if (paramMap != null) {urlBuilder.append("?");try {for (Map.Entry<String, String> entry : paramMap.entrySet()) {urlBuilder.append(URLEncoder.encode(entry.getKey(), "utf-8")).append("=").append(URLEncoder.encode(entry.getValue(), "utf-8")).append("&");}} catch (Exception e) {e.printStackTrace();}urlBuilder.deleteCharAt(urlBuilder.length() - 1);}request.url(urlBuilder.toString());return this;}/*** 初始化post方法** @param isJsonPost true等于json的方式提交数据,类似postman里post方法的raw*                   false等于普通的表单提交* @return*/public OkHttpUtils post(boolean isJsonPost) {RequestBody requestBody;if (isJsonPost) {String json = "";if (paramMap != null) {json = JSON.toJSONString(paramMap);}requestBody = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), json);} else {FormBody.Builder formBody = new FormBody.Builder();if (paramMap != null) {paramMap.forEach(formBody::add);}requestBody = formBody.build();}request = new Request.Builder().post(requestBody).url(url);return this;}/*** 同步请求** @return*/public String sync() {setHeader(request);try {Response response = okHttpClient.newCall(request.build()).execute();assert response.body() != null;return response.body().string();} catch (IOException e) {e.printStackTrace();return "请求失败:" + e.getMessage();}}/*** 异步请求,有返回值*/public String async() {StringBuilder buffer = new StringBuilder("");setHeader(request);okHttpClient.newCall(request.build()).enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {buffer.append("请求出错:").append(e.getMessage());}@Overridepublic void onResponse(Call call, Response response) throws IOException {assert response.body() != null;buffer.append(response.body().string());getSemaphoreInstance().release();}});try {getSemaphoreInstance().acquire();} catch (InterruptedException e) {e.printStackTrace();}return buffer.toString();}/*** 异步请求,带有接口回调** @param callBack*/public void async(ICallBack callBack) {setHeader(request);okHttpClient.newCall(request.build()).enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {callBack.onFailure(call, e.getMessage());}@Overridepublic void onResponse(Call call, Response response) throws IOException {assert response.body() != null;callBack.onSuccessful(call, response.body().string());}});}/*** 为request添加请求头** @param request*/private void setHeader(Request.Builder request) {if (headerMap != null) {try {for (Map.Entry<String, String> entry : headerMap.entrySet()) {request.addHeader(entry.getKey(), entry.getValue());}} catch (Exception e) {e.printStackTrace();}}}/*** 生成安全套接字工厂,用于https请求的证书跳过** @return*/private static SSLSocketFactory createSSLSocketFactory(TrustManager[] trustAllCerts) {SSLSocketFactory ssfFactory = null;try {SSLContext sc = SSLContext.getInstance("SSL");sc.init(null, trustAllCerts, new SecureRandom());ssfFactory = sc.getSocketFactory();} catch (Exception e) {e.printStackTrace();}return ssfFactory;}private static TrustManager[] buildTrustManagers() {return new TrustManager[]{new X509TrustManager() {@Overridepublic void checkClientTrusted(X509Certificate[] chain, String authType) {}@Overridepublic void checkServerTrusted(X509Certificate[] chain, String authType) {}@Overridepublic X509Certificate[] getAcceptedIssuers() {return new X509Certificate[]{};}}};}/*** 自定义一个接口回调*/public interface ICallBack {void onSuccessful(Call call, String data);void onFailure(Call call, String errorMsg);}
}

3.测试

@SpringBootTest
class SpringBootOkhttp3ApplicationTests {@Testvoid contextLoads() {// get请求,方法顺序按照这种方式,切记选择post/get一定要放在倒数第二,同步或者异步倒数第一,才会正确执行OkHttpUtils.builder().url("请求地址,http/https都可以")// 有参数的话添加参数,可多个.addParam("参数名", "参数值").addParam("参数名", "参数值")// 也可以添加多个.addHeader("Content-Type", "application/json; charset=utf-8").get()// 可选择是同步请求还是异步请求//.async();.sync();System.out.println("----------------------------------");// post请求,分为两种,一种是普通表单提交,一种是json提交OkHttpUtils.builder().url("请求地址,http/https都可以")// 有参数的话添加参数,可多个.addParam("参数名", "参数值").addParam("参数名", "参数值")// 也可以添加多个.addHeader("Content-Type", "application/json; charset=utf-8")// 如果是true的话,会类似于postman中post提交方式的raw,用json的方式提交,不是表单// 如果是false的话传统的表单提交.post(true).sync();// 选择异步有两个方法,一个是带回调接口,一个是直接返回结果OkHttpUtils.builder().url("").post(false).async();OkHttpUtils.builder().url("").post(false).async(new OkHttpUtils.ICallBack() {@Overridepublic void onSuccessful(Call call, String data) {// 请求成功后的处理}@Overridepublic void onFailure(Call call, String errorMsg) {// 请求失败后的处理}});}
}

OkHttp协议介绍以及文件下载和上传+OkHttp协议封装+OkHttp拦截器____SpringBoot——集成Okhttp3相关推荐

  1. Android网络功能开发(4)——文件下载和上传

    本篇介绍使用HTTP协议实现文件下载和上传.在客户端和服务器的通信过程中,可能有些多媒体或数据文件需要下载或上传,可以通过HTTP协议实现. 首先看使用HTTP协议下载文件的原理:客户端发送一个HTT ...

  2. Android开发-使用FTP协议和HTTP协议进行文件下载和上传

    FTP 是File Transfer Protocol(文件传输协议)的英文简称,从这个名字也能看出来,这个协议是为了文件传输而生的. 使用前需要下载一个commons-net-3.3.jar 直接看 ...

  3. SpringMVC与JSON传值,取值,使用SpringMVC实现文件的上传与下载,SpringMVC拦截器

    一. JSON 1.1 什么是JSON 在实际开发中,通常需要和别的系统交换数据,数据交换的格式通常有XML和JSON等: JSON(JavaScript Object Notation:JavaSc ...

  4. Linux文件下载和上传工具lrzsz

    可使用yum命令安装:yum install -y lrzsz 或者下载源码进行安装.下载地址:https://ohse.de/uwe/software/lrzsz.html 下载:sz sz fil ...

  5. Android小知识-剖析OkHttp中的五个拦截器(上篇)

    本平台的文章更新会有延迟,大家可以关注微信公众号-顾林海,包括年底前会更新kotlin由浅入深系列教程,目前计划在微信公众号进行首发,如果大家想获取最新教程,请关注微信公众号,谢谢 前面几节介绍了Ok ...

  6. OKHttp五大拦截器

    文章目录 [1]五大拦截器总体概述 一.责任链设计模式 ①定义: ②为什么要使用责任链模式 [2]拦截器的工作流程 一.默认的5大拦截器有哪些? [3]RetryAndFollowUpIntercep ...

  7. 标定协议之XCP标定协议介绍

    作者 | WenDao_Engineer 微信公众号 | 闻道工程师之家 在<标定协议基础知识介绍>一文中我们介绍了常用的标定协议有CCP和XCP两种,在前面CCP标定协议系列文章对CCP ...

  8. okhttp之拦截器

    okhttp的拦截器是项目中的精髓代码,今天我们来具体分析一下,base4.9.1版本,首先列一下okhttp的类图用来加深印象 我们已经知道拦截器是在RealCall中添加的: val interc ...

  9. OkHttp 3.x 源码解析之Interceptor 拦截器

    拦截器 Java里的拦截器是动态拦截Action调用的对象.它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行,同时也提供了一种可以提 ...

最新文章

  1. 2019半年总结:Teams are powerful
  2. 上班第一天公司要你用Spring Boot 实现万能文件在线预览
  3. 数据结构之归并排序图文详解及代码(C++实现)
  4. Stack around the variable 'date' was corrupted.
  5. SAP CRM和Cloud for Customer的UI界面皮肤更改
  6. Swift开发图解入门
  7. pycharm ubuntu 安装_Nvidia Jetson Xavier 安装配置(ubuntu 18.04)
  8. VS2010 教程:创建一个 WPF 应用程序 (第一节)
  9. Google我的商家设定
  10. RVC使用指南(五)-性能服务
  11. java运行指定文件_java打开指定文件(运行指定程序exe)
  12. CSS中可以让文字在水平和垂直方向上重叠的两个属性
  13. JavaScript高级程序设计(第3版).pdf
  14. plsqldev1105_x64与instantclient_11_2配置使用
  15. 计量经济学学习笔记:多元线性模型
  16. 免费注册的域名.tk
  17. c语言作业与实验报告,c语言实验报告
  18. 图扑软件数字孪生油气管道站,搭建油气运输管控平台
  19. 如何调用百度地图API---定位、显示热力图、路径导航等(很方便很强大)
  20. java遍历变量_java – 循环遍历众多变量

热门文章

  1. sheets.add示例_Java ArrayDeque add()方法与示例
  2. 汉子编码比字母编码长_字母/博客作者编码问题(使用动态编程)
  3. php榛子云短信验证,java + maven +榛子云短信 实现发送短信验证码功能
  4. php有多少魔术方法,PHP常用的几个魔术方法
  5. matplotlib画图_漂亮,超详细的matplotlib画图基础
  6. 先进技术android,React Native实战(JavaScript开发iOS和Android应用)/计算机科学先进技术译丛...
  7. 计算机操作系统 内存_计算机内存的类型| 操作系统
  8. duration java_Java Duration类| 带示例的dividBy()方法
  9. js中的转译_JavaScript中的填充和转译
  10. SpringCloud Ribbon中的7种负载均衡策略!