Java请求Http接口-OkHttp(超详细-附带工具类)

简介:OkHttp是一个默认有效的HTTP客户端,有效地执行HTTP可以加快您的负载并节省带宽,如果您的服务有多个IP地址,如果第一次连接失败,OkHttp将尝试备用地址。这对于IPv4 + IPv6和冗余数据中心中托管的服务是必需的。OkHttp启动具有现代TLS功能(SNI,ALPN)的新连接,并在握手失败时回退到TLS 1.0,OkHttp支持Android 2.3及更高版本。对于Java,最低要求是1.7。

操作步骤:

1、创建OkhttpClient。

2、mClient执行newCall将Request转化成一个Call。

3、最后call执行excute同步执行,enqueue异步执行。

4、Request主要通过Request.Builder来构建。

5、缓存。

6、取消请求。

导包

<!--okhttp3--><dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>4.9.1</version></dependency><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.5</version></dependency>

GET请求

get无参

/*** 以get方式调用第三方接口* @param url*/public static void doGet1(String url) throws IOException {OkHttpClient okHttpClient = new OkHttpClient();final Request request = new Request.Builder().url(url).get()//默认就是GET请求,可以不写.build();Response response = okHttpClient.newCall(request).execute();String string = response.body().string();System.out.println(string);}

get有参

public static void doGet2(String url, Map<String, Object> paramMap) throws IOException {OkHttpClient okHttpClient = new OkHttpClient();Request.Builder requestbuilder = new Request.Builder().get();//默认就是GET请求,可以不写StringBuilder urlbuilder = new StringBuilder(url);if (Objects.nonNull(paramMap)) {urlbuilder.append("?");paramMap.forEach((key, value) -> {try {urlbuilder.append(URLEncoder.encode(key, "utf-8")).append("=").append(URLEncoder.encode((String) value, "utf-8")).append("&");} catch (UnsupportedEncodingException e) {e.printStackTrace();}});urlbuilder.deleteCharAt(urlbuilder.length() - 1);}Request request = requestbuilder.url(urlbuilder.toString()).build();Response response = okHttpClient.newCall(request).execute();String string = response.body().string();System.out.println(string);}

get带参数和请求头

  /*** 以get方式调用第三方接口* @param url*/public static void doGet3(String url, Map<String, Object> paramMap,Map<String, String> heardMap) throws IOException {OkHttpClient okHttpClient = new OkHttpClient();Request.Builder requestbuilder = new Request.Builder().get();//默认就是GET请求,可以不写//增加参数StringBuilder urlbuilder = new StringBuilder(url);if (Objects.nonNull(paramMap)) {urlbuilder.append("?");paramMap.forEach((key, value) -> {try {urlbuilder.append(URLEncoder.encode(key, "utf-8")).append("=").append(URLEncoder.encode((String) value, "utf-8")).append("&");} catch (UnsupportedEncodingException e) {e.printStackTrace();}});urlbuilder.deleteCharAt(urlbuilder.length() - 1);}//增加请求头Request.Builder heardBuilder = requestbuilder.url(urlbuilder.toString());for (Map.Entry<String, String> stringObjectEntry : heardMap.entrySet()) {heardBuilder.addHeader(stringObjectEntry.getKey(),stringObjectEntry.getValue());}Request request = heardBuilder.build();Response response = okHttpClient.newCall(request).execute();System.out.println(response.body().string());System.out.println(response.message());System.out.println(response.code());}

get请求 换种方式获取结果

/*** 以get方式调用第三方接口* @param url*/public static void doGet(String url,Map<String, Object> paramMap,Map<String, String> heardMap) {OkHttpClient okHttpClient = new OkHttpClient();Request.Builder requestbuilder = new Request.Builder().get();//默认就是GET请求,可以不写//增加参数StringBuilder urlbuilder = new StringBuilder(url);if (Objects.nonNull(paramMap)) {urlbuilder.append("?");paramMap.forEach((key, value) -> {try {urlbuilder.append(URLEncoder.encode(key, "utf-8")).append("=").append(URLEncoder.encode((String) value, "utf-8")).append("&");} catch (UnsupportedEncodingException e) {e.printStackTrace();}});urlbuilder.deleteCharAt(urlbuilder.length() - 1);}//增加请求头Request.Builder heardBuilder = requestbuilder.url(urlbuilder.toString());for (Map.Entry<String, String> stringObjectEntry : heardMap.entrySet()) {heardBuilder.addHeader(stringObjectEntry.getKey(),stringObjectEntry.getValue());}Request request = heardBuilder.build();Call call = okHttpClient.newCall(request);call.enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {System.out.println( "onFailure: ");}@Overridepublic void onResponse(Call call, Response response) throws IOException {System.out.println(response.body().string());System.out.println(response.message());System.out.println(response.code());}});}

POST请求

post-json传参

 /*** post请求* @param url* @param json*/public static void doPost(String url, String json, Map<String, String> heardMap) throws IOException {MediaType mediaType = MediaType.parse("application/json; charset=utf-8");String requestBody = json;Request.Builder requestbuilder = new Request.Builder().url(url).post(RequestBody.create(mediaType, requestBody));//增加请求头for (Map.Entry<String, String> stringObjectEntry : heardMap.entrySet()) {requestbuilder.addHeader(stringObjectEntry.getKey(), stringObjectEntry.getValue());}Request request = requestbuilder.build();OkHttpClient okHttpClient = new OkHttpClient();Response response = okHttpClient.newCall(request).execute();System.out.println(response.body().string());System.out.println(response.message());System.out.println(response.code());}

post-params传参

 /*** post请求* @param url* @param json*/public static void doPost(String url, String json, Map<String, String> heardMap) throws IOException {MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded");String requestBody = json;Request.Builder requestbuilder = new Request.Builder().url(url).post(RequestBody.create(mediaType, requestBody));//增加请求头for (Map.Entry<String, String> stringObjectEntry : heardMap.entrySet()) {requestbuilder.addHeader(stringObjectEntry.getKey(), stringObjectEntry.getValue());}Request request = requestbuilder.build();OkHttpClient okHttpClient = new OkHttpClient();Response response = okHttpClient.newCall(request).execute();System.out.println(response.body().string());System.out.println(response.message());System.out.println(response.code());}
 /*** post请求* @param url* @param paramMap*/public static void doPost1(String url, Map<String, Object> paramMap,Map<String,String> heardMap) throws IOException {FormBody.Builder formBody = new FormBody.Builder();if (Objects.nonNull(paramMap)) {paramMap.forEach((x, y) -> formBody.add(x, (String) y));}RequestBody requestBody = formBody.build();Request.Builder requestbuilder = new Request.Builder().url(url).post(requestBody);//增加请求头for (Map.Entry<String, String> stringObjectEntry : heardMap.entrySet()) {requestbuilder.addHeader(stringObjectEntry.getKey(), stringObjectEntry.getValue());}Request request = requestbuilder.build();OkHttpClient okHttpClient = new OkHttpClient();Response response = okHttpClient.newCall(request).execute();System.out.println(response.body().string());System.out.println(response.message());System.out.println(response.code());}

post-表单传参-上传文件

达到类似效果
在这里插入图片描述

 public static void doPost2(String url,File file) throws IOException {OkHttpClient client = new OkHttpClient();RequestBody body = new MultipartBody.Builder().setType(MultipartBody.FORM).addFormDataPart("id", "111").addFormDataPart("content", "{\"do_layout\":1}").addFormDataPart("file", file.getName(), RequestBody.create(MediaType.parse("text/plain"), file)).build();Request request = new Request.Builder().url(url).post(body).addHeader("x-tilake-app-key", "").addHeader("x-tilake-ca-timestamp", "").addHeader("x-tilake-ca-signature", "").addHeader("Content-Type", body.contentType().toString()).addHeader("Accept", "*/*").build();try {Response response = client.newCall(request).execute();System.out.println(response.body().string());System.out.println(response.message());System.out.println(response.code());} catch (IOException e) {throw new RuntimeException(e);}}

提供一个工具类,可以直接使用

package com.example.httpdemo.okhttp;import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import okhttp3.*;
import org.apache.commons.io.FileUtils;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.TimeUnit;@Slf4j
public class OkHttpUtil {public static final String MEDIA_TYPE_JSON = "application/json; charset=utf-8";private OkHttpUtil() {}/*** 获取默认的OkHttpClient* @return*/public static OkHttpClient getOkHttpClient() {return getOkHttpClient(60, 60, 60);}public static OkHttpClient getOkHttpClient(int connectTimeout, int readTimeOut, int writeTimeOut) {OkHttpClient.Builder builder = new okhttp3.OkHttpClient().newBuilder();builder.connectTimeout(connectTimeout, TimeUnit.SECONDS);builder.readTimeout(readTimeOut, TimeUnit.SECONDS);builder.writeTimeout(writeTimeOut, TimeUnit.SECONDS);return builder.build();}/*** get请求* @param okHttpClient* @param url* @param headers header参数* @return*/public static String get(OkHttpClient okHttpClient, String url, Headers headers) {log.info("okHttpClient get url:{}.", url);Request request = new Request.Builder().url(url).headers(headers).get().build();String responseData = request(okHttpClient, url, request);log.info("okHttpClient get url:{},request responseData====> {}", url, responseData);return responseData;}public static String get(OkHttpClient okHttpClient, String url) {Headers headers = new Headers.Builder().build();return get( okHttpClient, url, headers);}/*** GET请求。使用默认的 okHttpClient 和 headers* @param url* @return*/public static String get(String url) {OkHttpClient okHttpClient = getOkHttpClient();Headers headers = new Headers.Builder().build();return get( okHttpClient, url, headers);}/*** post请求,获取响应结果** @param okHttpClient* @param url* @param bodyJson* @param headers* @return*/public static String post(OkHttpClient okHttpClient, String url, JSONObject bodyJson, Headers headers) {log.info("okHttpClient post url:{}, body====> {}", url, bodyJson);MediaType mediaTypeJson = MediaType.parse(MEDIA_TYPE_JSON);RequestBody requestBody = RequestBody.create(mediaTypeJson, JSON.toJSONString(bodyJson));Request request = new Request.Builder().url(url).headers(headers).post(requestBody).build();String responseData = request(okHttpClient, url, request);log.info("okHttpClient post url:{},post responseData====> {}", url, responseData);return responseData;}public static String post(OkHttpClient okHttpClient, String url, JSONObject bodyJson) {Headers headers = new Headers.Builder().build();return post( okHttpClient,  url,  bodyJson, headers);}/*** post请求。使用默认的 okHttpClient 和 headers* @param url* @param bodyJson* @return*/public static String post( String url, JSONObject bodyJson) {//使用默认的 okHttpClientOkHttpClient okHttpClient = getOkHttpClient();Headers headers = new Headers.Builder().build();//如果需要自定义 okHttpClient或headers传参,可以调用以下方法return post( okHttpClient,  url,  bodyJson, headers);}/*** 获取响应结果** @param okHttpClient* @param url* @param request* @return*/public static String request(OkHttpClient okHttpClient, String url, Request request) {String responseData = "";try (Response response = okHttpClient.newCall(request).execute()) {if (response != null && response.body() != null) {return response.body().string();}} catch (Exception e) {log.error("okHttpClient getResponse error.url:{}", url, e);}return responseData;}/*** 上传文件** @param okHttpClient  okHttp客户端* @param url 上传文件的url* @param fileKey       文件对应的key* @param formDataJson  form-data参数* @param headers* @param file* @return*/public static String uploadFile(OkHttpClient okHttpClient, String url,String fileKey, File file, JSONObject formDataJson, Headers headers) {log.info("uploadFile url:{}, uploadFile formDataJson====> {}", url, formDataJson);// 支持传文件的同时,传参数。MultipartBody requestBody = getMultipartBody(fileKey, file,  formDataJson);// 构建request请求体Request request = new Request.Builder().url(url).headers(headers).post(requestBody).build();String responseData = request(okHttpClient, url, request);// 会在本地产生临时文件,用完后需要删除if (file.exists()) {file.delete();}return responseData;}/*** 上传文件* @param url* @param fileKey form-data文件对应的key* @param multipartFile 文件上传对应的 multipartFile* @param formDataJson form-data参数* @return*/public static String uploadFile(String url,String fileKey, MultipartFile multipartFile, JSONObject formDataJson) {//使用默认的okHttpClientOkHttpClient okHttpClient = getOkHttpClient();Headers headers = new Headers.Builder().build();return uploadFile(okHttpClient, url, fileKey, getFile(multipartFile), formDataJson, headers);}public static String uploadFile(OkHttpClient okHttpClient, String url,String fileKey, File file, JSONObject formDataJson) {Headers headers = new Headers.Builder().build();return uploadFile(okHttpClient, url,  fileKey, file, formDataJson, headers);}/*** 上传文件* 使用默认的okHttpClient** @param url* @param fileKey form-data文件对应的key* @param file 文件* @param formDataJson form-data参数* @return*/public static String uploadFile(String url,String fileKey, File file, JSONObject formDataJson) {//使用默认的okHttpClientOkHttpClient okHttpClient = getOkHttpClient();Headers headers = new Headers.Builder().build();return uploadFile(okHttpClient, url, fileKey, file, formDataJson, headers);}/*** 上传文件用。构建form-data 参数** @param fileKey       文件对应的key* @param file          文件* @param formDataJson  form-data参数* @return*/public static MultipartBody getMultipartBody(String fileKey, File file, JSONObject formDataJson) {RequestBody fileBody = RequestBody.create(MultipartBody.FORM, file);MultipartBody.Builder bodyBuilder = new MultipartBody.Builder();// 设置传参为form-data格式bodyBuilder.setType(MultipartBody.FORM);bodyBuilder.addFormDataPart(fileKey, file.getName(), fileBody);// 添加 form-data参数for (Map.Entry<String, Object> entry : formDataJson.entrySet()) {//参数通过 bodyBuilder.addFormDataPart(key, value) 添加bodyBuilder.addFormDataPart(entry.getKey(), Objects.toString(entry.getValue(),""));}return bodyBuilder.build();}/*** 获取文件* @param multipartFile* @return*/public static File getFile(MultipartFile multipartFile) {File file = new File(Objects.requireNonNull(multipartFile.getOriginalFilename()));try {FileUtils.copyInputStreamToFile(multipartFile.getInputStream(), file);} catch (IOException e) {log.error("copyInputStreamToFile error.", e);}return file;}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/45854.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LVS 负载均衡集群

集群 集群&#xff08;Cluster&#xff09;是一组相互连接的计算机或服务器&#xff0c;它们通过网络一起工作以完成共同的任务或提供服务。集群的目标是通过将多台计算机协同工作&#xff0c;提高计算能力、可用性、性能和可伸缩性&#xff0c;适用于大量高并发的场景。 集群…

【HBZ分享】java中的BitSet 与 Redis中的BitMap 与 布隆过滤器

BitMap的存储原理 bitMap他会标识出某个整数是否存在&#xff0c;存在即为1&#xff0c;不存在对应位即为0bitMap是存储int类型的&#xff0c;int 4byte&#xff0c; 1byte 8bit&#xff0c;因此bitMap数组中的每个下标可以标识出32个数字是否存在bitMap相当于一个个小格子&…

马哈鱼数据血缘工具背后的项目: gsp_demo_java 项目简单介绍与使用

0.背景 马哈鱼数据血缘工具(https://www.sqlflow.cn/)是SQLflow工具的中文译名,实际就是sqlflow. 对于SQL flow来说,底层调用的是General SQL Parser(GSP https://sqlparser.com) 的库. 这个gsp有开源的java demo项目:https://github.com/sqlparser/gsp_demo_java 1.快速使用…

第6章:支持向量机

间隔与支持向量 w为法向量&#xff0c;决定的是超平面的方向。b是偏移项&#xff0c;决定了超平面与原点之间的距离。 为什么最大化间隔&#xff0c;得到的就是最优平面呢&#xff1f; 当超平面没有正确划分正负样本时&#xff0c;几何间隔为负数。几何间隔&#xff0c;各个…

网络编程基础(1)

目录 网络编程解决是跨主机的进程间通讯 1、网络 2、互联网 3、ip地址 &#xff08;1&#xff09;ipv4: &#xff08;2&#xff09;ipV6:1 &#xff08;3&#xff09;IP地址的组成&#xff1a; (4)Linux查看IP地址&#xff1a;ifconfig 4、mac地址 5、ping Ip地址 6…

VisualVM(All-in-One Java Troubleshooting Tool)多合-故障处理工具

VisualVM&#xff1a;多合-故障处理工具 VisualVM&#xff08;All-in-One Java Troubleshooting Tool&#xff09;是功能最强大的 运行监视 和 故障处理 程序之一&#xff0c;曾经在很长一段时间内是Oracle官方主力发展的虚拟机故障处理工具。Oracle曾在VisualVM的软件说明中写…

数据结构--最短路径 Floyd算法

数据结构–最短路径 Floyd算法 F l o y d 算法&#xff1a;求出每⼀对顶点之间的最短路径 \color{red}Floyd算法&#xff1a;求出每⼀对顶点之间的最短路径 Floyd算法&#xff1a;求出每⼀对顶点之间的最短路径 使⽤动态规划思想&#xff0c;将问题的求解分为多个阶段 对于n个顶…

QT学习笔记-Linux ARM环境下实现QT程序通过ODBC驱动访问SQLServer数据库

QT学习笔记-Linux ARM环境下实现QT程序通过ODBC驱动访问SQLServer数据库 0、背景1、基本环境2、搭建交叉编译环境3、在交叉编译服务器上交叉编译安装unixODBC3.1 下载unixODBC3.2 交叉编译unixODBC3.2.1 基本编译说明3.2.2 交叉编译说明3.2.3 ./configure -build,-host,-target…

不知道开黑语音哪个软件好?

黑盒语音官方网站&#xff1a;https://chat.top 免费支持AI降噪免费支持高品质立体声免费支持码率128Kbps,192Kbps免费支持上传100M文件免费支持动态房间头像和横幅支持更多自定义动态表情即将支持更多免费功能

IP 地址监控工具

地址监控实用程序是一套 IP 工具&#xff0c;包括 IP 地址监控工具、流氓检测工具和 MAC 地址解析器&#xff0c;用于日常监控和管理 DNS 名称、IP和 MAC 地址。地址监控工具用于 IP监控&#xff0c;用于管理 DNS 名称、网络的 IP 和 MAC 地址&#xff0c;并跟踪 IP 地址。 IP…

JavaScript中的this关键字的作用,以及它如何确定其值

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ this关键字的作用⭐ this的值取决于执行上下文⭐ 示例⭐ 总结⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这…

MySQL数据库第十四课--------sql优化---------层层递进

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; ​&#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382; &#x1f389;&#x1f389;&#x1f389…

极光笔记 | 如何为您的业务开发和训练一个AI-BOT

生成式AI&#xff08;Generative AI&#xff09;是当今科技领域的前沿技术之一。随着数据量的不断增加和计算能力的不断提升&#xff0c;AI技术在企业和个人生活中的应用越来越广泛。AI-BOT&#xff08;以下简称BOT&#xff09;是生成式AI技术的其中一种重要的应用形式&#xf…

最小二乘拟合圆柱

目录 一、算法原理二、代码实现 本文由CSDN点云侠原创&#xff0c;原文链接。如果你不是在点云侠的博客中看到该文章&#xff0c;那么此处便是不要脸的爬虫。 一、算法原理 由圆柱面的几何特性可得&#xff0c;圆柱面上的点到其轴线的距离恒等于半径 r 0 r_0 r0​&#xff0c;…

Java自学到什么程度就可以去找工作了?

引言 Java作为一门广泛应用于软件开发领域的编程语言&#xff0c;对于初学者来说&#xff0c;了解到什么程度才能开始寻找实习和入职机会是一个常见的问题。 本文将从实习和入职这两个方面&#xff0c;分点详细介绍Java学习到什么程度才能够开始进入职场。并在文章末尾给大家安…

基于springboot+vue的博物馆藏品平台(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

剑指 Offer 48. 最长不含重复字符的子字符串(C++实现)

剑指 Offer 48. 最长不含重复字符的子字符串https://leetcode.cn/problems/zui-chang-bu-han-zhong-fu-zi-fu-de-zi-zi-fu-chuan-lcof/ dp 注意&#xff1a;缩小 不含重复字符子串 时的写法 dp_1 min(i - charToIndex[s[i]], dp_0 1); int lengthOfLongestSubstring(string s…

python中使用xml快速创建Caption和URL书签管理器应用程序

导语&#xff1a; 本文介绍如何使用wxPython库创建一个Caption和URL管理器应用程序。该应用程序具有图形用户界面&#xff0c;允许用户输入Caption和URL&#xff0c;并将其保存到XML文件中。此外&#xff0c;还提供了浏览文件夹并选择HTML文件的功能&#xff0c;并可以运行另一…

深入解析淘宝API,实现高效商务应用

淘宝API的基本调用 1. API文档与SDK 淘宝API官方提供了详细的API文档&#xff0c;包含了API的使用说明、参数列表、示例代码等内容。开发者可以通过文档了解每个API接口的具体功能和使用方法。此外&#xff0c;淘宝API还提供了多种编程语言的SDK&#xff0c;方便开发者进行快速…

jupyter notebook出现ERR_SSL_VERSION_OR_CIPHER_MISMATCH解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…