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.hqwc.cn/news/78119.html

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

相关文章

800V高压电驱动系统架构分析

需要电驱竞品样件请联&#xff1a;shbinzer &#xff08;拆车邦&#xff09; 过去一年是新能源汽车市场爆发的一年&#xff0c;据中汽协数据&#xff0c;2021年新能源汽车销售352万辆&#xff0c;同比大幅增长157.5%。新能源汽车技术发展迅速&#xff0c;畅销车辆在动力性能…

MySQL索引介绍 为什么mysql使用B+树

什么是索引&#xff1f; 索引是一种用于快速查询和检索数据的数据结构&#xff0c;常见的索引结构有&#xff1a;B树&#xff0c;B树和Hash。 索引的作用就相当于目录。打个比方&#xff0c;我们在查字典的时候&#xff0c;如果没有目录&#xff0c;那我们就只能一页一页的去…

redis 7高级篇1 redis的单线程与多线程

一 redis单线程与多线程 1.1 redis单线程&多线程 1.redis的单线程 redis单线程主要是指Redis的网络IO和键值对读写是由一个线程来完成的&#xff0c;Redis在处理客户端的请求时包括获取 (socket 读)、解析、执行、内容返回 (socket 写) 等都由一个顺序串行的主线程处理…

Android4:约束布局

创建项目My Constraint Layout 一般创建项目之后activity_main.xml文件默认就是采用约束布局&#xff0c;如&#xff1a; <?xml version"1.0" encoding"utf-8"?> <androidx.constraintlayout.widget.ConstraintLayoutxmlns:android"http:…

【Kubernetes】Rancher管理集群

目录 1、安装 rancher 2、登录 Rancher 平台 3、Rancher 管理已存在的 k8s 集群 4、Rancher 部署监控系统 5、使用 Rancher 仪表盘管理 k8s 集群 以创建 nginx 服务为例 创建名称空间 namespace 创建 Deployment 资源 创建 service 1、安装 rancher 在 所有 node 节点下…

Flink学习笔记(一)

流处理 批处理应用于有界数据流的处理&#xff0c;流处理则应用于无界数据流的处理。 有界数据流&#xff1a;输入数据有明确的开始和结束。 无界数据流&#xff1a;输入数据没有明确的开始和结束&#xff0c;或者说数据是无限的&#xff0c;数据通常会随着时间变化而更新。 在…

麒麟操作系统安装

官网&#xff1a;麒麟 下载&#xff1a;首页->桌面操作系统->银河麒麟桌面操作系统V10->申请试用 提交后->银河麒麟桌面操作系统V10->AMD64版->选择本地下载链接 安装&#xff1a; &#xff08;1&#xff09;创建新的虚拟机->自定义(高级)->稍后安装…

vue3、react组件数据传值对比分析——父组件传递子组件,子组件传递父组件

文章目录 ⭐前言⭐react 组件传值实例&#x1f496;父组件传值给子组件&#xff08;props&#xff09;&#x1f496;子组件传递事件给父组件props绑定事件&#x1f496;父组件触发子组件的事件Ref ⭐vue3 组件传值实例&#x1f496; 父组件传递数据给子组件props&#x1f496; …

CQ课堂 | 社区版 2.3.0 新功能操作演示直播快来预约!

CloudQuery 一体化数据库操作管控云平台&#xff0c;社区版 V 2.3.0 已发布&#xff01; 三大核心功能增强 1、 权限管控&#xff1a;新增自动授权、分级授权 2、 动态脱敏&#xff1a;新增脱敏配置导入导出、脱敏扫描 3、 审计中心&#xff1a;新增上卷下钻能力、审计归档 …

Redis高可用:主从复制详解

目录 1.什么是主从复制&#xff1f; 2.优势 3.主从复制的原理 4.全量复制和增量复制 4.1 全量复制 4.2 增量复制 5.相关问题总结 5.1 当主服务器不进行持久化时复制的安全性 5.2 为什么主从全量复制使用RDB而不使用AOF&#xff1f; 5.3 为什么还有无磁盘复制模式&#xff…

部署问题集合(十九)linux设置Tomcat、Docker,以及使用脚本开机自启(亲测)

前言 因为不想每次启动虚拟机都要手动启动一遍这些东西&#xff0c;所以想要设置成开机自启的状态 设置Tomcat开机自启 创建service文件 vi /etc/systemd/system/tomcat.service添加如下内容&#xff0c;注意修改启动脚本和关闭脚本的地址 [Unit] DescriptionTomcat9068 A…

框架(Git基础详解及Git在idea中集成步骤)

目录 基础&#xff1a; idea集成Git并添加项目到git仓库 1.idea集成git&#xff0c;集成.git.exe文件 2.初始化本地Git仓库项目 3. 将工作区代码添加到暂存区 4.将暂存区代码添加到本地仓库 5.Git本地库操作 Idea集成Gitee并提交代码到第三方库 1.setting里搜索gitee 2.添…