目录
OkHttp3
MAVEN 依赖
Http get 操作示例
Http Post 操作示例
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 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;
- }
- /**
- * 异步 Http 调用参考模板: Get,Post,Put
- * 需要异步调用的接口一般情况下你需要定制一个专门的 Http 方法
- *
- * @param httpMethod
- * @param url
- * @param content
- * @return
- */
- @Deprecated
- public 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() {
- @Override
- public void onFailure(Call call, IOException e) {
- log.error("异步 http {} 请求失败,[url={}, param={}]", httpMethod.name(), url, content);
- throw new RuntimeException("异步 http 请求失败, url:" + url);
- }
- @Override
- public 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() {
- @Override
- public void onFailure(Call call, IOException e) {
- failure.accept(e);
- }
- @Override
- public void onResponse(Call call, Response response) throws IOException {
- respConsumer.accept(response);
- }
- });
- }
- //test
- public static void main(String[] args) {
- String url = "http://www.baidu.com";
- System.out.println(httpGet(url));
- }
- }
来源: https://www.cnblogs.com/keeya/p/11368791.html