简介

HTTP是现代应用常用的一种交换数据和媒体的网络方式,高效地使用HTTP能让资源加载更快,节省带宽。OkHttp是一个高效的HTTP客户端,它有以下默认特性:

  • 支持HTTP/2,允许所有同一个主机地址的请求共享同一个socket连接
  • 连接池减少请求延时
  • 透明的GZIP压缩减少响应数据的大小
  • 缓存响应内容,避免一些完全重复的请求

源码:https://github.com/square/okhttp

说明:OkHttp支持Android 2.3及以上版本Android平台,对于Java, JDK1.7及以上。

当网络出现问题的时候OkHttp依然坚守自己的职责,它会自动恢复一般的连接问题,如果你的服务有多个IP地址,当第一个IP请求失败时,OkHttp会交替尝试你配置的其他IP,OkHttp使用现代TLS技术(SNI, ALPN)初始化新的连接,当握手失败时会回退到TLS 1.0。

简单使用

引入maven依赖

  1. <dependency>
  2. <groupId>com.squareup.okhttp3</groupId>
  3. <artifactId>okhttp</artifactId>
  4. <version>4.0.0-RC1</version>
  5. </dependency>

请求方法

同步请求

就是执行请求的操作是阻塞式,直到 HTTP 响应返回。它对应 OKHTTP 中的 execute 方法。

GET请求

  1. /**
  2. * 同步get方式请求
  3. *
  4. * @param url
  5. * @return
  6. * @throws IOException
  7. */
  8. public static String doGet(String url) throws IOException {
  9. OkHttpClient client = new OkHttpClient();
  10. Request request = new Request.Builder()
  11. .url(url)
  12. .build();
  13. try (Response response = client.newCall(request).execute()) {
  14. if (response.isSuccessful()) {
  15. return response.body().string();
  16. } else {
  17. throw new IOException("Unexpected code " + response);
  18. }
  19. }
  20. }

POST请求

Json提交参数

  1. /**
  2. * 同步post方式请求-json提交参数
  3. *
  4. * @param url
  5. * @param json
  6. * @return
  7. * @throws IOException
  8. */
  9. public static String doPost(String url, final String json) throws IOException {
  10. OkHttpClient client = new OkHttpClient();
  11. RequestBody body = RequestBody.create(JSON, json);
  12. Request request = new Request.Builder()
  13. .url(url)
  14. .post(body)
  15. .build();
  16. try (Response response = client.newCall(request).execute()) {
  17. if (response.isSuccessful()) {
  18. return response.body().string();
  19. } else {
  20. throw new IOException("Unexpected code " + response);
  21. }
  22. }
  23. }

form表单提交参数

  1. /**
  2. * 同步post方式请求-form表单提交参数
  3. *
  4. * @param url
  5. * @param paramsMap
  6. * @return
  7. * @throws IOException
  8. */
  9. public static String doPost(String url, Map<String, String> paramsMap) throws IOException {
  10. OkHttpClient client = new OkHttpClient();
  11. FormBody.Builder builder = new FormBody.Builder();
  12. for (String key : paramsMap.keySet()) {
  13. builder.add(key, paramsMap.get(key));
  14. }
  15. RequestBody formBody = builder.build();
  16. Request request = new Request.Builder()
  17. .url(url)
  18. .post(formBody)
  19. .build();
  20. try (Response response = client.newCall(request).execute()) {
  21. if (response.isSuccessful()) {
  22. return response.body().string();
  23. } else {
  24. throw new IOException("Unexpected code " + response);
  25. }
  26. }
  27. }

异步请求

就是类似于非阻塞式的请求,它的执行结果一般都是通过接口回调的方式告知调用者。它对应 OKHTTP 中的 enqueue 方法。

这是异步请求,所以调用enqueue则无需再开启子线程,enqueue方法会自动将网络请求部分放入子线程中执行。enqueue回调方法onResponse与onFailure都执行在子线程中。

注意事项:

    1. 回调接口的onFailure方法和onResponse执行在子线程。
    1. Response.code是http响应行中的code,如果访问成功则返回200.这个不是服务器设置的,而是http协议中自带的。res中的code才是服务器设置的。注意二者的区别。
    1. response.body().string()本质是输入流的读操作,所以它还是网络请求的一部分,所以这行代码必须放在子线程。
    1. response.body().string()只能调用一次,在第一次时有返回值,第二次再调用时将会返回null。原因是:response.body().string()的本质是输入流的读操作,必须有服务器的输出流的写操作时客户端的读操作才能得到数据。而服务器的写操作只执行一次,所以客户端的读操作也只能执行一次,第二次将返回null。
    1. 再次强调,response.body().string()方法必须放在子线程中。当执行这行代码得到结果后,再跳转到UI线程修改UI。

异步请求自定义回调函数

  1. /**
  2. * okhttp 异步调用回调函数
  3. */
  4. static class OkHttpCallback implements Callback {
  5. @Override
  6. public void onFailure(@NotNull Call call, @NotNull IOException e) {
  7. log.error(e);
  8. }
  9. @Override
  10. public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
  11. if (response.isSuccessful()) {
  12. log.info("Successful data acquisition . . . ");
  13. log.info("response.code()==" + response.code());
  14. log.info("response.body().string()==" + response.body().string());
  15. }
  16. }
  17. }

GET请求

  1. /**
  2. * 异步get方式请求
  3. *
  4. * @param url
  5. * @return
  6. * @throws IOException
  7. */
  8. public static void doSyncGet(String url) {
  9. OkHttpClient okHttpClient = new OkHttpClient();
  10. final Request request = new Request.Builder()
  11. .url(url)
  12. .get()
  13. .build();
  14. Call call = okHttpClient.newCall(request);
  15. call.enqueue(new OkHttpCallback());
  16. }

POST请求

Json提交参数

  1. /**
  2. * 异步post方式请求-json提交参数
  3. *
  4. * @param url
  5. * @param json
  6. * @return
  7. * @throws IOException
  8. */
  9. public static void doSyncPost(String url, final String json) {
  10. OkHttpClient client = new OkHttpClient();
  11. RequestBody body = RequestBody.create(JSON, json);
  12. Request request = new Request.Builder()
  13. .url(url)
  14. .post(body)
  15. .build();
  16. client.newCall(request).enqueue(new OkHttpCallback());
  17. }

form表单提交参数

  1. /**
  2. * 异步post方式请求-form表单提交参数
  3. *
  4. * @param url
  5. * @param paramsMap
  6. * @return
  7. * @throws IOException
  8. */
  9. public static void doSyncPost(String url, Map<String, String> paramsMap) {
  10. OkHttpClient client = new OkHttpClient();
  11. FormBody.Builder builder = new FormBody.Builder();
  12. for (String key : paramsMap.keySet()) {
  13. builder.add(key, paramsMap.get(key));
  14. }
  15. RequestBody formBody = builder.build();
  16. Request request = new Request.Builder()
  17. .url(url)
  18. .post(formBody)
  19. .build();
  20. client.newCall(request).enqueue(new OkHttpCallback());
  21. }

参考

示例代码

  1. package com.ohaotian.feifz.style.study.utils;
  2. import lombok.extern.log4j.Log4j2;
  3. import okhttp3.Call;
  4. import okhttp3.Callback;
  5. import okhttp3.FormBody;
  6. import okhttp3.MediaType;
  7. import okhttp3.OkHttpClient;
  8. import okhttp3.Request;
  9. import okhttp3.RequestBody;
  10. import okhttp3.Response;
  11. import org.jetbrains.annotations.NotNull;
  12. import java.io.IOException;
  13. import java.util.Map;
  14. /**
  15. * @author feifz
  16. * @version 1.0.0
  17. * @Description http工具类,基于okhttp3
  18. * @createTime 2019年06月06日 09:30:00
  19. */
  20. @Log4j2
  21. public class HttpUtil {
  22. public static final MediaType JSON = MediaType.get("application/json; charset=utf-8");
  23. /**
  24. * 同步get方式请求
  25. *
  26. * @param url
  27. * @return
  28. * @throws IOException
  29. */
  30. public static String doGet(String url) throws IOException {
  31. OkHttpClient client = new OkHttpClient();
  32. Request request = new Request.Builder()
  33. .url(url)
  34. .build();
  35. try (Response response = client.newCall(request).execute()) {
  36. if (response.isSuccessful()) {
  37. return response.body().string();
  38. } else {
  39. throw new IOException("Unexpected code " + response);
  40. }
  41. }
  42. }
  43. /**
  44. * 异步get方式请求
  45. *
  46. * @param url
  47. * @return
  48. * @throws IOException
  49. */
  50. public static void doSyncGet(String url) {
  51. OkHttpClient okHttpClient = new OkHttpClient();
  52. final Request request = new Request.Builder()
  53. .url(url)
  54. .get()
  55. .build();
  56. Call call = okHttpClient.newCall(request);
  57. call.enqueue(new OkHttpCallback());
  58. }
  59. /**
  60. * 同步post方式请求-json提交参数
  61. *
  62. * @param url
  63. * @param json
  64. * @return
  65. * @throws IOException
  66. */
  67. public static String doPost(String url, final String json) throws IOException {
  68. OkHttpClient client = new OkHttpClient();
  69. RequestBody body = RequestBody.create(JSON, json);
  70. Request request = new Request.Builder()
  71. .url(url)
  72. .post(body)
  73. .build();
  74. try (Response response = client.newCall(request).execute()) {
  75. if (response.isSuccessful()) {
  76. return response.body().string();
  77. } else {
  78. throw new IOException("Unexpected code " + response);
  79. }
  80. }
  81. }
  82. /**
  83. * 异步post方式请求-json提交参数
  84. *
  85. * @param url
  86. * @param json
  87. * @return
  88. * @throws IOException
  89. */
  90. public static void doSyncPost(String url, final String json) {
  91. OkHttpClient client = new OkHttpClient();
  92. RequestBody body = RequestBody.create(JSON, json);
  93. Request request = new Request.Builder()
  94. .url(url)
  95. .post(body)
  96. .build();
  97. client.newCall(request).enqueue(new OkHttpCallback());
  98. }
  99. /**
  100. * 同步post方式请求-form表单提交参数
  101. *
  102. * @param url
  103. * @param paramsMap
  104. * @return
  105. * @throws IOException
  106. */
  107. public static String doPost(String url, Map<String, String> paramsMap) throws IOException {
  108. OkHttpClient client = new OkHttpClient();
  109. FormBody.Builder builder = new FormBody.Builder();
  110. for (String key : paramsMap.keySet()) {
  111. builder.add(key, paramsMap.get(key));
  112. }
  113. RequestBody formBody = builder.build();
  114. Request request = new Request.Builder()
  115. .url(url)
  116. .post(formBody)
  117. .build();
  118. try (Response response = client.newCall(request).execute()) {
  119. if (response.isSuccessful()) {
  120. return response.body().string();
  121. } else {
  122. throw new IOException("Unexpected code " + response);
  123. }
  124. }
  125. }
  126. /**
  127. * 异步post方式请求-form表单提交参数
  128. *
  129. * @param url
  130. * @param paramsMap
  131. * @return
  132. * @throws IOException
  133. */
  134. public static void doSyncPost(String url, Map<String, String> paramsMap) {
  135. OkHttpClient client = new OkHttpClient();
  136. FormBody.Builder builder = new FormBody.Builder();
  137. for (String key : paramsMap.keySet()) {
  138. builder.add(key, paramsMap.get(key));
  139. }
  140. RequestBody formBody = builder.build();
  141. Request request = new Request.Builder()
  142. .url(url)
  143. .post(formBody)
  144. .build();
  145. client.newCall(request).enqueue(new OkHttpCallback());
  146. }
  147. /**
  148. * okhttp 异步调用回调函数
  149. */
  150. static class OkHttpCallback implements Callback {
  151. @Override
  152. public void onFailure(@NotNull Call call, @NotNull IOException e) {
  153. log.error(e);
  154. }
  155. @Override
  156. public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
  157. if (response.isSuccessful()) {
  158. log.info("Successful data acquisition . . . ");
  159. log.info("response.code()==" + response.code());
  160. log.info("response.body().string()==" + response.body().string());
  161. }
  162. }
  163. }
  164. }

结语

欢迎关注微信公众号『码仔zonE』,专注于分享Java、云计算相关内容,包括SpringBoot、SpringCloud、微服务、Docker、Kubernetes、Python等领域相关技术干货,期待与您相遇!

Http请求-okhttp3基本用法的更多相关文章

  1. JAVA学习笔记 (okHttp3的用法)

    最近的项目中有个接口是返回文件流数据,根据我们这边一个验签的插件,我发现里面有okHttpClient提供了Call.Factory,所以就学习了下okHttp3的用法. 1.概述 okhttp是一个 ...

  2. http请求工具-OkHttp用法

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

  3. JMeter Http请求之content-type用法

    转载自https://www.cnblogs.com/imyalost/p/6726795.html 本文讲三种content-type以及在Jmeter中对应的参数输入方式 第一部分:目前工作中涉及 ...

  4. SpringMVC RequestMapping & 请求参数

    SpringMVC 概述 Spring 为展现层提供的基于 MVC 设计理念的优秀的Web 框架,是目前最主流的 MVC 框架之一 Spring3.0 后全面超越 Struts2,成为最优秀的 MVC ...

  5. Ajax中的get和post两种请求方式的异同

    Ajax中我们经常用到get和post请求.那么什么时候用get请求,什么时候用post方式请求呢? 在做回答前我们首先要了解get和post的区别.   1. get是把参数数据队列加到提交表单的A ...

  6. [转]Android各大网络请求库的比较及实战

    自己学习android也有一段时间了,在实际开发中,频繁的接触网络请求,而网络请求的方式很多,最常见的那么几个也就那么几个.本篇文章对常见的网络请求库进行一个总结. HttpUrlConnection ...

  7. Android网络请求心路历程

    HTTP请求&响应 既然说从入门级开始就说说Http请求包的结构.一次请求就是向目标服务器发送一串文本.什么样的文本?有下面结构的文本.HTTP请求包结构 例子: 1 2 3 4 5 6 7 ...

  8. Android 几种网络请求的区别与联系

    HttpUrlConnection 最开始学android的时候用的网络请求是HttpUrlConnection,当时很多东西还不知道,但是在android 2.2及以下版本中HttpUrlConne ...

  9. 请求数据传入(SpringMVC)

    1.    请求处理方法签名 Spring MVC 通过分析处理方法的签名,HTTP请求信息绑定到处理方法的相应人参中. Spring MVC 对控制器处理方法签名的限制是很宽松的,几乎可以按喜欢的任 ...

随机推荐

  1. 11-14序列化模块之json、pickle、shelve

    序列化的目的 1.以某种存储形式使自定义对象持久化: 2.将对象从一个地方传递到另一个地方. 3.使程序更具维护性. 序列化--转向一个字符串数据类型序列--及时字符串 何处用到: 数据存储 网络上传 ...

  2. Python time altzone()方法

    描述 Python time altzone() 函数返回格林威治西部的夏令时地区的偏移秒数.高佣联盟 www.cgewang.com 如果该地区在格林威治东部会返回负值(如西欧,包括英国).对夏令时 ...

  3. PHP __construct() 函数

    实例 函数创建一个新的 SimpleXMLElement 对象,然后输出 body 节点的内容:高佣联盟 www.cgewang.com <?php $note=<<<XML ...

  4. js 读取word和txt(react版) + 正则分割段落

    show the code 前提:需要mammoth包~ import React, { useState, useReducer } from 'react'; import { Button, A ...

  5. scala---lazy

    scala中用lazy定义的变量叫做惰性变量,会实现延迟加载.惰性变量只能是不可变的变量.并且只有在调用惰性变量的时候才会被初始化. class Test1 { } object Test1 { de ...

  6. zabbix脚本发送邮件告警

    目录 zabbix邮箱告警 内部使用第三方邮箱发送邮箱告警 zabbix使用第三方邮箱发送告警 通过脚本使用第三方邮箱发送邮箱告警 zabbix邮箱告警 环境说明: zabbix服务端 192.168 ...

  7. Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:testCompile (default-testCompile) on project docker_springcloud_demo: Fatal error compiling: 无效的标记: -parameters -> [Help 1]

    [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:testCompile (def ...

  8. kubernetes ingress 重定向地址错误

    环境: 有两个 kubernetes 集群: 一个版本为1.11,后面使用A集群代替,ingress 镜像版本为 0.19(quay.io/kubernetes-ingress-controller/ ...

  9. 使用Azure人脸API对图片进行人脸识别

    人脸识别是人工智能机器学习比较成熟的一个领域.人脸识别已经应用到了很多生产场景.比如生物认证,人脸考勤,人流监控等场景.对于很多中小功能由于技术门槛问题很难自己实现人脸识别的算法.Azure人脸API ...

  10. Linux无名管道通信介绍

    Linux下无名管道一般仅用于父子进程间的通信: 测试代码如下 //file name: fifo_test.c #include <sys/prctl.h> #include " ...