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文档
程序员都很希望别人能写技术文档,自己却很不愿意写文档.因为接口数量繁多,并且充满业务细节,写文档需要花大量的时间去处理格式排版,代码修改后还需要同步修改文档,经常因为项目时间紧等原因导致文档滞后于代码 ...
随机推荐
- EAC3 Spectral Extension Process
1.overview 当使用Spectral extension时,channel中的高频部分的transform coefficients由低频部分合成. transform coefficient ...
- SARS病毒
每一道题目皆是一处美丽的风景: 何为科技的力量和程序的思维哦,在这暑假的编程之路上,我要好好地体验一番来嘞! 数学规律是:f(n)=2^(n-1)+4^(n-1). //递推分析可得!具体过程 ...
- 265. 粉刷房子 II
Q: A: 首先这题可以和粉刷房子这题一样解法,对于i号房子,遍历k种颜色,对于每一种,都去找i-1号房子除该颜色之外的最小花费.但上一题是3种颜色,总复杂度O(N),这题k种颜色,复杂度O(NK^2 ...
- JS高级---案例贪吃蛇,把封装的函数移动到js文件中
案例贪吃蛇,把封装的函数移动到js文件中 <!DOCTYPE html> <html lang="en"> <head> <meta ch ...
- 第十九篇 vim编辑器的使用技巧
vim编辑器 ~/.viminfo文件中存储了vim编辑器中常用的命令 vim编辑器共有3中模式:命令模式.末行模式和输入模式,三种模式的转换方式如下图所示: vim 文件名 # 编辑一个文 ...
- 1.3 使用jmeter进行http接口测试
来源: http://www.cnblogs.com/alisapan/p/6150309.html 此篇纯是搬运记载.. 一.测试需求描述 1. 本次测试的接口为http服务端接口 2. 接口的 ...
- mybatis--多对多关联
mybatis3.0 添加了association和collection标签专门用于对多个相关实体类数据进行级联查询,但仍不支持多个相关实体类数据的级联保存和级联删除操作.因此在进行实体类多对多映射表 ...
- Codeforces Round #624 (Div. 3) F
题意: 给出n的质点,带着初位置和速度: 如果中途两点可以相遇dis(i,j)=0: 如果不可以相遇,mindis(i,j): 求n个点的两两质点最小dis(i,j)之和 思路: 因为当初位置x和速度 ...
- 前端——语言——Core JS——《The good part》读书笔记——第三章节(Object)
本章介绍对象. 在学习Java时,对象理解为公共事物的抽象,实例为具体的个例,对象为抽象的概念,例如人为抽象的概念,具体的个例为张三,李四. Java对象种类多,包含普通类,JavaBean,注解,枚 ...
- 【资源分享】RPG Maker 2000/2003 简体中文版
*----------------------------------------------[下载区]----------------------------------------------* ...