关闭页面特效

java采用 OkHttp调用接口

1|0OkHttp3


一般来说,Java 直接调用HTTP接口常见的有三种方式,第一种是JDK原生的方式,第二种是apache 提供的HTTP工具,还有一种是本文着重介绍的OkHttp3工具。
当然也有httpclient等工具,但是较为老旧,强烈推荐okhttp3

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

  1. HTTP/2支持允许对同一主机的所有请求共享一个socket。
  2. 连接池减少了请求延迟(如果HTTP/2不可用)。
  3. 透明GZIP压缩下载大小。
  4. 响应缓存完全避免了网络重复请求。
  5. 使用OkHttp很容易。它的请求/响应API设计为流畅的构建器和不变性。它同时支持同步阻塞调用和带回调的异步调用。

2|0MAVEN依赖


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

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

3|0Http get操作示例


highlighter- Java 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(); } }

4|0Http 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(); } }

5|0Http 超时控制


当调用的对等方不可用时,超时使调用失败。网络可能是由于客户机连接问题、服务器可用性问题或两者之间的任何问题造成的。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); } }

6|0工具类示例


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; 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 */ @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)); } }

7|0参考


https://www.cnblogs.com/keeya/p/11368791.html


__EOF__

作  者HKnight
出  处https://www.cnblogs.com/HKnight/p/16613270.html
关于博主:编程路上的小学生,热爱技术,喜欢专研。评论和私信会在第一时间回复。或者直接私信我。
版权声明:署名 - 非商业性使用 - 禁止演绎,协议普通文本 | 协议法律文本
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!

posted @   HKnight  阅读(540)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
0
0
关注
跳至底部
点击右上角即可分享
微信分享提示