Spring Boot 中使用 HttpClient 进行 POST GET PUT DELETE
有的时候,我们的 Spring Boot 应用需要调用第三方接口,这个接口可能是 Http协议、可能是 WebService、可能是 FTP或其他格式,本章讨论 Http 接口的调用。
通常基于 Http/Https 协议的接口请求动作 POST/GET/PUT/DELETE/PATCH 操作。交互的内容可以是文本、Json 或 Xml。
在 Spring Boot 中使用 Apache HttpClient 类库能够方便快捷地解决 Http 调用问题。
1 新建 Spring Boot Maven 示例工程项目
注意:是用来 IDEA 开发工具
- File > New > Project,如下图选择
Spring Initializr然后点击 【Next】下一步 - 填写
GroupId(包名)、Artifact(项目名) 即可。点击 下一步
groupId=com.fishpro
artifactId=httpclient - 选择依赖
Spring Web Starter前面打钩。 - 项目名设置为
spring-boot-study-httpclient.
2 引入依赖 Pom
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.3</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
3 编写 HttpClient 代码示例
3.1 传统的 get/post
大多数情况,第三方提供的接口都是基于 GET/POST,而且一般需要设定 url、http head 的值,所以我们下面的代码是针对只有 GET/POST 的接口设定
/**
* 传统的 http get/post 实现
* */
public class HttpClientUtils {
/**
* http get
* @param url 可带参数的 url 链接
* @param heads http 头信息
* */
public String get(String url,Map<String,String> heads){
org.apache.http.client.HttpClient httpClient= HttpClients.createDefault();
HttpResponse httpResponse = null;
String result="";
HttpGet httpGet=new HttpGet(url);
if(heads!=null){
Set<String> keySet=heads.keySet();
for(String s:keySet){
httpGet.addHeader(s,heads.get(s));
}
}
try{
httpResponse=httpClient.execute(httpGet);
HttpEntity httpEntity=httpResponse.getEntity();
if(httpEntity!=null){
result= EntityUtils.toString(httpEntity,"utf-8");
}
}catch (IOException e){
e.printStackTrace();
}
return result;
}
/**
* http post
* */
public static String post(String url, String data, Map<String, String> heads){
org.apache.http.client.HttpClient httpClient= HttpClients.createDefault();
HttpResponse httpResponse = null;
String result="";
HttpPost httpPost=new HttpPost(url);
if(heads!=null){
Set<String> keySet=heads.keySet();
for(String s:keySet){
httpPost.addHeader(s,heads.get(s));
}
}
try{
StringEntity s=new StringEntity(data,"utf-8");
httpPost.setEntity(s);
httpResponse=httpClient.execute(httpPost);
HttpEntity httpEntity=httpResponse.getEntity();
if(httpEntity!=null){
result= EntityUtils.toString(httpEntity,"utf-8");
}
}catch (IOException e){
e.printStackTrace();
}
return result;
}
}
调用也非常简单
3.2 基于 REST 接口的操作方法
我们可以单独为 REST 风格接口提供方法,因为 HttpClient 为我们单独提供了针对 GET/POST/PUT/DELETE 的方法。
3.2.1 GET 方法
- 首先创建一个http请求 HttpGet httpGet=new HttpGet(url);
- 自定义一个 Response Handler
- 执行 httpclient.execute(请求,Handler)
- 处理返回
/**
* http get
* @param url 可带参数的 url 链接
* @param heads http 头信息
* */
public static String get(String url,Map<String,String> heads){
org.apache.http.client.HttpClient httpClient= HttpClients.createDefault();
HttpResponse httpResponse = null;
String result="";
HttpGet httpGet=new HttpGet(url);
if(heads!=null){
Set<String> keySet=heads.keySet();
for(String s:keySet){
httpGet.addHeader(s,heads.get(s));
}
}
try{
httpResponse=httpClient.execute(httpGet);
HttpEntity httpEntity=httpResponse.getEntity();
if(httpEntity!=null){
result= EntityUtils.toString(httpEntity,"utf-8");
}
}catch (IOException e){
e.printStackTrace();
}
return result;
}
3.2.2 POST 方法
- 首先创建一个http请求 HttpPost httpPost = new HttpPost(url);
- 自定义一个 Response Handler,向POST中添加数据(JSON 信息)和 Header信息
httpPost.setHeader("Accept", "application/json");
httpPost.setHeader("Content-type", "application/json");
- 执行 httpclient.execute(请求,Handler)
- 处理返回
/**
* post 方法
* @param url post 的 url
* @param data 数据 application/json 的时候 为json格式
* @param heads Http Head 参数
* */
public static String post(String url,String data,Map<String,String> heads) throws IOException{
try (CloseableHttpClient httpclient = HttpClients.createDefault()) {
HttpPost httpPost = new HttpPost(url);
if(heads!=null){
Set<String> keySet=heads.keySet();
for(String s:keySet){
httpPost.addHeader(s,heads.get(s));
}
}
StringEntity stringEntity = new StringEntity(data);
httpPost.setEntity(stringEntity);
System.out.println("Executing request " + httpPost.getRequestLine());
// Create a custom response handler
ResponseHandler < String > responseHandler = response -> {
int status = response.getStatusLine().getStatusCode();
if (status >= 200 && status < 300) {
HttpEntity entity = response.getEntity();
return entity != null ? EntityUtils.toString(entity) : null;
} else {
throw new ClientProtocolException("Unexpected response status: " + status);
}
};
String responseBody = httpclient.execute(httpPost, responseHandler);
System.out.println("----------------------------------------");
System.out.println(responseBody);
return responseBody;
}
}
3.2.3 PUT 方法
- 首先创建一个http请求 HttpPut httpPut = new HttpPut(url);
- 自定义一个 Response Handler,向POST中添加数据(JSON 信息)和 Header信息
httpPut.setHeader("Accept", "application/json");
httpPut.setHeader("Content-type", "application/json");
- 执行 httpclient.execute(请求,Handler)
- 处理返回
/**
* put 方法
* @param url put 的 url
* @param data 数据 application/json 的时候 为json格式
* @param heads Http Head 参数
* */
public static String put(String url,String data,Map<String,String> heads) throws IOException{
try (CloseableHttpClient httpclient = HttpClients.createDefault()) {
HttpPut httpPut = new HttpPut(url);
if(heads!=null){
Set<String> keySet=heads.keySet();
for(String s:keySet){
httpPut.addHeader(s,heads.get(s));
}
}
StringEntity stringEntity = new StringEntity(data);
httpPut.setEntity(stringEntity);
System.out.println("Executing request " + httpPut.getRequestLine());
// Create a custom response handler
ResponseHandler < String > responseHandler = response -> {
int status = response.getStatusLine().getStatusCode();
if (status >= 200 && status < 300) {
HttpEntity entity = response.getEntity();
return entity != null ? EntityUtils.toString(entity) : null;
} else {
throw new ClientProtocolException("Unexpected response status: " + status);
}
};
String responseBody = httpclient.execute(httpPut, responseHandler);
System.out.println("----------------------------------------");
System.out.println(responseBody);
return responseBody;
}
}
3.2.4 DELETE 方法
- 首先创建一个http请求 HttpDelete httpDelete = new HttpDelete(url);
- 自定义一个 Response Handler
- 执行 httpclient.execute(请求,Handler)
- 处理返回
/**
* delete 方法
* @param url delete 的 url
* @param heads Http Head 参数
* */
public static String delete(String url,Map<String,String> heads) throws IOException {
try (CloseableHttpClient httpclient = HttpClients.createDefault()) {
HttpDelete httpDelete = new HttpDelete(url);
if(heads!=null){
Set<String> keySet=heads.keySet();
for(String s:keySet){
httpDelete.addHeader(s,heads.get(s));
}
}
System.out.println("Executing request " + httpDelete.getRequestLine());
// Create a custom response handler
ResponseHandler < String > responseHandler = response -> {
int status = response.getStatusLine().getStatusCode();
if (status >= 200 && status < 300) {
HttpEntity entity = response.getEntity();
return entity != null ? EntityUtils.toString(entity) : null;
} else {
throw new ClientProtocolException("Unexpected response status: " + status);
}
};
String responseBody = httpclient.execute(httpDelete, responseHandler);
System.out.println("----------------------------------------");
System.out.println(responseBody);
return responseBody;
}
}
参考链接
https://www.javaguides.net/2018/10/apache-httpclient-get-post-put-and-delete-methods-example.html
Spring Boot 中使用 HttpClient 进行 POST GET PUT DELETE的更多相关文章
- spring boot(三):Spring Boot中Redis的使用
spring boot对常用的数据库支持外,对nosql 数据库也进行了封装自动化. redis介绍 Redis是目前业界使用最广泛的内存数据存储.相比memcached,Redis支持更丰富的数据结 ...
- Spring Boot中的事务管理
原文 http://blog.didispace.com/springboottransactional/ 什么是事务? 我们在开发企业应用时,对于业务人员的一个操作实际是对数据读写的多步操作的结合 ...
- Spring Boot中的注解
文章来源:http://www.tuicool.com/articles/bQnMra 在Spring Boot中几乎可以完全弃用xml配置文件,本文的主题是分析常用的注解. Spring最开始是为了 ...
- 在Spring Boot中使用Https
本文介绍如何在Spring Boot中,使用Https提供服务,并将Http请求自动重定向到Https. Https证书 巧妇难为无米之炊,开始的开始,要先取得Https证书.你可以向证书机构申请证书 ...
- Spring Boot中使用Swagger2构建强大的RESTful API文档
由于Spring Boot能够快速开发.便捷部署等特性,相信有很大一部分Spring Boot的用户会用来构建RESTful API.而我们构建RESTful API的目的通常都是由于多终端的原因,这 ...
- Dubbo在Spring和Spring Boot中的使用
一.在Spring中使用Dubbo 1.Maven依赖 <dependency> <groupId>com.alibaba</groupId> <artifa ...
- springboot(十一):Spring boot中mongodb的使用
mongodb是最早热门非关系数据库的之一,使用也比较普遍,一般会用做离线数据分析来使用,放到内网的居多.由于很多公司使用了云服务,服务器默认都开放了外网地址,导致前一阵子大批 MongoDB 因配置 ...
- springboot(三):Spring boot中Redis的使用
spring boot对常用的数据库支持外,对nosql 数据库也进行了封装自动化. redis介绍 Redis是目前业界使用最广泛的内存数据存储.相比memcached,Redis支持更丰富的数据结 ...
- Spring Boot中使用Swagger2构建API文档
程序员都很希望别人能写技术文档,自己却很不愿意写文档.因为接口数量繁多,并且充满业务细节,写文档需要花大量的时间去处理格式排版,代码修改后还需要同步修改文档,经常因为项目时间紧等原因导致文档滞后于代码 ...
随机推荐
- 爬山 启发式合并 / STL
题目 其实 Kano 曾经到过由乃山,当然这名字一看山主就是 Yuno 嘛.当年 Kano 看见了由乃山,内心突然涌出了一股杜甫会当凌绝顶,一览众山小的豪气,于是毅然决定登山. 但是 Kano 总是习 ...
- 【C语言】多维数组
C 语言支持多维数组.多维数组声明的一般形式如下: type name[size1][size2]...[sizeN]; 二维数组 多维数组最简单的形式是二维数组.一个二维数组,在本质上,是一个一维数 ...
- MyBatis(4)——配置文件优化
配置文件优化 执行流程:读取配置流程->sqlSessionFactory->sqlSession(连接.读取sql并执行相应操作.关闭) a)配置优化:通过中文参考指南的说明可知-> ...
- 线索二叉树的详细实现(C++)
线索二叉树概述 二叉树虽然是非线性结构,但二叉树的遍历却为二又树的结点集导出了一个线性序列.希望很快找到某一结点的前驱或后继,但不希望每次都要对二叉树遍历一遍,这就需要把每个结点的前驱和后继信息记录下 ...
- 概率dp poj 3071
题目首先给出一个n,表示比赛一共进行n轮,那么队伍就有2^n只队伍输入一个2^n*2^n的矩阵,p[i][j]代表队伍i打败队伍j的概率dp[i][j]代表第i轮比赛的时候,队伍j赢的概率首先初始化时 ...
- 吴裕雄 python 机器学习——伯努利贝叶斯BernoulliNB模型
import numpy as np import matplotlib.pyplot as plt from sklearn import datasets,naive_bayes from skl ...
- 无显示器安装raspberry zero w树莓派 zero w
笔者的环境 1. Macbook 电脑用于烧录树莓派系统到SD卡 2. 树莓派 zero w 把SD卡放进读卡器,插到Mac电脑上, 打开命令行工具Terminal diskutil list列出di ...
- select2多选框初始化默认值和获得值
select2多选自带手动输入搜索功能,可怜我还查寻半天api 获得值: //chang函数获取选择的option $(".js-example").change(function ...
- django model 高级进阶
十.model高级用法: 10.1 ORM映射: Object Relational Mapping: orm映射的任务: 将list ,object 的操作转化为sql语句,根据对象生成数据表,将查 ...
- Django 无法同步数据库model相应字段问题
前言:今天也是充满bug的一天,脸上笑嘻嘻....(继续,讲文明,懂礼貌) 1,问题描述,models中的字段设置的是浮点型,但是输出的结果总是int()类型 models average_score ...