目录

  • Java 调用http接口(基于OkHttp的Http工具类方法示例)

    • OkHttp3
    • MAVEN依赖
    • Http get操作示例
    • Http Post操作示例
    • Http 超时控制
    • 工具类示例

Java 调用http接口(基于OkHttp的Http工具类方法示例)

现在的互联网项目中,自己单撸所有功能的时代已经过去了,有些功能往往有第三方或者公司其他团队提供服务,你要做得仅仅就是和它们进行对接。对接一些大公司提供的服务时,它们往往会提供对应语言的SDK和说明文档;而团队与团队之间的项目对接往往通过接口进行数据交互,往往都是HTTP JSON交互的形式。

本文介绍如何使用这些API,然后给出博主自己写的一个工具列demo,需要的可以在此基础上修改。

OkHttp3

一般来说,Java 直接调用HTTP接口常见的有三种方式,第一种是JDK原生的方式,第二种是apache 提供的HTTP工具,还有一种是本文着重介绍的OkHttp3工具

OkHttp3官方文档介绍了它的4点优势:

  • HTTP/2支持允许对同一主机的所有请求共享一个socket。
  • 连接池减少了请求延迟(如果HTTP/2不可用)。
  • 透明GZIP压缩下载大小。
  • 响应缓存完全避免了网络重复请求。

使用OkHttp很容易。它的请求/响应API设计为流畅的构建器和不变性。它同时支持同步阻塞调用和带回调的异步调用。

下面介绍一下常见的GET方法和POST方法官方示例,首先添加依赖:

MAVEN依赖

<!--okhttp依赖-->
<dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>4.0.0</version>
</dependency>

Http get操作示例

OkHttpClient client = new OkHttpClient();String run(String url) throws IOException {Request request = new Request.Builder().url(url).build();try (Response response = client.newCall(request).execute()) {return response.body().string();}
}

Http Post操作示例

public static final MediaType JSON= MediaType.get("application/json; charset=utf-8");OkHttpClient client = new OkHttpClient();String post(String url, String json) throws IOException {RequestBody body = RequestBody.create(JSON, json);Request request = new Request.Builder().url(url).post(body).build();try (Response response = client.newCall(request).execute()) {return response.body().string();}
}

Http 超时控制

当调用的对等方不可用时,超时使调用失败。网络可能是由于客户机连接问题、服务器可用性问题或两者之间的任何问题造成的。OkHttp支持连接、读取和写入超时。

private final OkHttpClient client;public ConfigureTimeouts() throws Exception {client = new OkHttpClient.Builder().connectTimeout(10, TimeUnit.SECONDS).writeTimeout(10, TimeUnit.SECONDS).readTimeout(30, TimeUnit.SECONDS).build();}public void run() throws Exception {Request request = new Request.Builder().url("http://httpbin.org/delay/2") // This URL is served with a 2 second delay..build();try (Response response = client.newCall(request).execute()) {System.out.println("Response completed: " + response);}
}

工具类示例

提供同步的GET和POST调用工具方法示例,提供了异步调用HTTP接口的demo

import okhttp3.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpMethod;
import org.springframework.scheduling.annotation.AsyncResult;
import org.springframework.util.CollectionUtils;import java.io.IOException;
import java.util.Map;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.function.Consumer;/*** @author axin* @since 2019-08-14*/
public class OkHttpUtils {private static final Logger log = LoggerFactory.getLogger(OkHttpUtils.class);private static final String HTTP_JSON = "application/json; charset=utf-8";private static final String HTTP_FORM = "application/x-www-form-urlencoded; charset=utf-8";private static final OkHttpClient okHttpClient = new OkHttpClient.Builder().connectTimeout(120, TimeUnit.SECONDS).readTimeout(120, TimeUnit.SECONDS).writeTimeout(120, TimeUnit.SECONDS).build();/*** get请求* 对于小文档,响应体上的string()方法非常方便和高效。* 但是,如果响应主体很大(大于1 MB),则应避免string(),* 因为它会将整个文档加载到内存中。在这种情况下,将主体处理为流。** @param url* @return*/public static String httpGet(String url) {if (url == null || "".equals(url)) {log.error("url为null!");return "";}Request.Builder builder = new Request.Builder();Request request = builder.get().url(url).build();try {Response response = okHttpClient.newCall(request).execute();if (response.code() == 200) {log.info("http GET 请求成功; [url={}]", url);return response.body().string();} else {log.warn("Http GET 请求失败; [errorCode = {} , url={}]", response.code(), url);}} catch (IOException e) {throw new RuntimeException("同步http GET 请求失败,url:" + url, e);}return null;}public static String httpGet(String url, Map<String, String> headers) {if (CollectionUtils.isEmpty(headers)) {return httpGet(url);}Request.Builder builder = new Request.Builder();headers.forEach((String key, String value) -> builder.header(key, value));Request request = builder.get().url(url).build();try {Response response = okHttpClient.newCall(request).execute();if (response.code() == 200) {log.info("http GET 请求成功; [url={}]", url);return response.body().string();} else {log.warn("Http GET 请求失败; [errorxxCode = {} , url={}]", response.code(), url);}} catch (IOException e) {throw new RuntimeException("同步http GET 请求失败,url:" + url, e);}return null;}/*** 同步 POST调用 无Header** @param url* @param json* @return*/public static String httpPostJson(String url, String json) {if (url == null || "".equals(url)) {log.error("url为null!");return "";}MediaType JSON = MediaType.parse(HTTP_JSON);RequestBody body = RequestBody.create(JSON, json);Request.Builder requestBuilder = new Request.Builder().url(url);Request request = requestBuilder.post(body).build();try {Response response = okHttpClient.newCall(request).execute();if (response.code() == 200) {log.info("http Post 请求成功; [url={}, requestContent={}]", url, json);return response.body().string();} else {log.warn("Http POST 请求失败; [ errorCode = {}, url={}, param={}]", response.code(), url, json);}} catch (IOException e) {throw new RuntimeException("同步http请求失败,url:" + url, e);}return null;}/*** 同步 POST调用 有Header** @param url* @param headers* @param json* @return*/public static String httpPostJson(String url, Map<String, String> headers, String json) {if (CollectionUtils.isEmpty(headers)) {httpPostJson(url, json);}MediaType JSON = MediaType.parse(HTTP_JSON);RequestBody body = RequestBody.create(JSON, json);Request.Builder requestBuilder = new Request.Builder().url(url);headers.forEach((k, v) -> requestBuilder.addHeader(k, v));Request request = requestBuilder.post(body).build();try {Response response = okHttpClient.newCall(request).execute();if (response.code() == 200) {log.info("http Post 请求成功; [url={}, requestContent={}]", url, json);return response.body().string();} else {log.warn("Http POST 请求失败; [ errorCode = {}, url={}, param={}]", response.code(), url, json);}} catch (IOException e) {throw new RuntimeException("同步http请求失败,url:" + url, e);}return null;}/*** 提交表单* @param url* @param content* @param headers* @return*/public static String postDataByForm(String url, String content, Map<String, String> headers) {MediaType JSON = MediaType.parse(HTTP_FORM);RequestBody body = RequestBody.create(JSON, content);Request.Builder requestBuilder = new Request.Builder().url(url);if (headers != null && headers.size() > 0) {headers.forEach((k, v) -> requestBuilder.addHeader(k, v));}Request request = requestBuilder.post(body).build();Response response = null;try {response = okHttpClient.newCall(request).execute();if (response.code() == 200) {log.info("postDataByForm; [postUrl={}, requestContent={}, responseCode={}]", url, content, response.code());return response.body().string();} else {log.warn("Http Post Form请求失败,[url={}, param={}]", url, content);}} catch (IOException e) {log.error("Http Post Form请求失败,[url={}, param={}]", url, content, e);throw new RuntimeException("Http Post Form请求失败,url:" + url);}return null;}/*** 异步Http调用参考模板:Get、Post、Put* 需要异步调用的接口一般情况下你需要定制一个专门的Http方法** @param httpMethod* @param url* @param content* @return*/@Deprecatedpublic static Future<Boolean> asyncHttpByJson(HttpMethod httpMethod, String url, Map<String, String> headers, String content) {MediaType JSON = MediaType.parse(HTTP_JSON);RequestBody body = RequestBody.create(JSON, content);Request.Builder requestBuilder = new Request.Builder().url(url);if (!CollectionUtils.isEmpty(headers)) {headers.forEach((key, value) -> requestBuilder.header(key, value));}switch (httpMethod) {case GET:requestBuilder.get();break;case POST:requestBuilder.post(body);break;default:}Request request = requestBuilder.build();Call call = okHttpClient.newCall(request);call.enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {log.error("异步http {} 请求失败,[url={}, param={}]", httpMethod.name(), url, content);throw new RuntimeException("异步http请求失败,url:" + url);}@Overridepublic void onResponse(Call call, final Response response) throws IOException {if (response.code() == 200) {System.out.println("需要加入异步回调操作");} else {log.error("异步http {} 请求失败,错误码为{},请求参数为[url={}, param={}]", httpMethod.name(), response.code(), url, content);}}});return new AsyncResult(true);}/*** lambda表达式异步调用http模板,不建议使用** @param request* @param failure* @param respConsumer*/public static void asyncCall(Request request, Consumer<Exception> failure, Consumer<Response> respConsumer) {okHttpClient.newCall(request).enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {failure.accept(e);}@Overridepublic void onResponse(Call call, Response response) throws IOException {respConsumer.accept(response);}});}//testpublic static void main(String[] args) {String url = "http://www.baidu.com";System.out.println(httpGet(url));}}

综上,本文介绍了Okhttp3的使用,并给出了工具类的demo,要注意的是,对于异步调用http方法需要根据你们项目的具体业务进行改造,增加回调失败与成功的业务逻辑。

文档链接:OkHttp官网

转载于:https://www.cnblogs.com/keeya/p/11368791.html

Java 调用http接口(基于OkHttp的Http工具类方法示例)相关推荐

  1. java调用飞信接口免费短信发送到对方手机

    原文:java调用飞信接口免费短信发送到对方手机 源代码下载地址:http://www.zuidaima.com/share/1550463460084736.htm 飞信发送信息限(移动用户) 1. ...

  2. java调用接口速度慢,Java 调用 webservice 接口,为什么这么慢

    Java 调用 webservice 接口,为什么这么慢,有没有好的优化方案,本人目前改成 http 方式发 soap 消息调用,速度依旧很慢,维持在平均 100ms 下不来. 之前用 cxf 的 J ...

  3. 第二篇:java调用公共数据接口:上海市车辆基本信息查询(java调用soap接口)

    java调用公共数据接口:上海市数据公共开放平台 前言 一.找个接口作为案例 二.查看文档 1.查看接口文档 2.确认接口地址与参数 三.编码(找代码直接跳这里!) 1.先创建一个返回数据的实体类 2 ...

  4. 第一篇:java调用公共数据接口:QQ在线状态查询(java调用http接口)

    java调用公共数据接口: webxml 前言 一.以webxml上的一个接口为案例 二.查看接口文档 1.查看支持的调用方式 2.确认接口地址与参数 三.编码(找代码直接跳这里!) 1.配置Rest ...

  5. 【转】java调用http接口的几种方式总结

    java调用http接口的几种方式总结 本文参考: https://blog.csdn.net/fightingXia/article/details/71775516 https://www.cnb ...

  6. Java调用REST接口(get,post请求方法)

    网上的调用方法实例千奇百怪,以下为本人自己整理的Java调用rest接口方法实例,包含get请求和post请求,可创建工具类方便调用,其中get.post请求解决了入出参中文乱码问题. get方式请求 ...

  7. java调用restful接口_Java调用RESTful接口的几种方式

    前端一般通过Ajax来调用,后端调用的方式还是挺多的,比如HttpURLConnection,HttpClient,Spring的RestTemplate 服务端代码如下: 服务端接口请求的URL:h ...

  8. Apache CXF生成java代码用java调用Webservice接口

    这里写自定义目录标题 使用java调用webservice接口 使用java调用webservice接口 当我们使用java去访问webservice的接口时,有很多种方式,这里我们使用apache ...

  9. java 调用webservice 接口,并解析返回参数

    java 调用webservice 接口,并解析返回参数 1. 设置传参,例如以下格式: // 确定传参格式以及赋值 String reqXml = "<createAppParam& ...

最新文章

  1. 【分块】#6284. 数列分块入门 8(区间赋值为相同的值,查询区间某值个数)
  2. ICLR2020 | CS-GNN:用平滑度刻画图信息的使用
  3. 企业单点登录解决方案(CAS)之二安装要求
  4. javascript 常用方法
  5. 基于geopandas的空间数据分析——空间计算篇(下)
  6. OpenJudge 7627 鸡蛋的硬度
  7. 深入理解C语言指针的奥秘(转)
  8. php开发Hive Web查询
  9. 21天Jmeter打卡Day14 监听器之查看结果树+断言结果+聚合报告+图形结果+表格查看结果
  10. 生产阶段Webpack打包【基础打包】
  11. 华为鸿蒙os和麒麟os区别,麒麟、鸿蒙皆自研,为何华为不像苹果将系统同时推送?...
  12. .net 注册引用的dll
  13. .Net程序猿玩转Android开发---(8)表格布局TableLayout
  14. java vuehello wotld,Vue Hello World
  15. 控制工程中的数学建模(6)——典型环节的数学模型(之二)
  16. c语言递归思想实践-整形数组求极值问题
  17. 本地编译 全志a33 的步骤
  18. bzoj4565 [Haoi2016]字符合并 (区间DP + 状压DP)
  19. 珠宝行业电子秤串口程序开发
  20. 继电器电路原理图,PNP和NPN三极管介绍

热门文章

  1. python3 如何给装饰器传递参数
  2. nginx 配置简介
  3. Spring Boot spring mvc 拦截器
  4. 安装多个版本JDK相关问题
  5. 第四季度数据中心网络设备销量达35亿美元
  6. hdu5246 超级赛亚ACMer (百度之星初赛)(模拟)
  7. 不当免费技术支持的10种方法
  8. Android启动界面优化技巧-Splash Screens的正确方式
  9. Hadoop生态圈-Hive的自定义函数之UDF(User-Defined-Function)
  10. Android 3.0 r1中文API文档(104) —— ViewTreeObserver