Java调用Http/Https接口(6)--RestTemplate调用Http/Https接口
RestTemplate是Spring提供的用于访问Http接口的客户端,提供同步的API;在将来的Spring版本中可能会过时,将逐渐被WebClient替代。文中所使用到的软件版本:Java 1.8.0_191、SpringBoot 2.2.1.RELEASE。
1、服务端
2、调用Http接口
2.1、GET请求
public static void get() {
try {
String requestPath = "http://localhost:8080/demo/httptest/getUser?userId=1000&userName=李白";
RestTemplate template = new RestTemplate();
//System.out.println(template.getMessageConverters());
//第二个为StringHttpMessageConverter
template.getMessageConverters().set(1, new StringHttpMessageConverter(Charset.forName("UTF-8")));
ResponseEntity<String> response = template.getForEntity(requestPath, String.class);
System.out.println("get返回状态:" + response.getStatusCode());
System.out.println("get返回结果:" + response.getBody());
} catch (Exception e) {
e.printStackTrace();
}
}
2.2、POST请求(发送键值对数据)
public static void post() {
String requestPath = "http://localhost:8080/demo/httptest/getUser";
RestTemplate template = new RestTemplate();
template.getMessageConverters().set(1, new StringHttpMessageConverter(Charset.forName("UTF-8")));
MultiValueMap<String, String> map = new LinkedMultiValueMap <String, String>();
map.add("userId", "1000");
map.add("userName", "李白");
ResponseEntity<String> response = template.postForEntity(requestPath, map, String.class);
System.out.println("post返回状态:" + response.getStatusCode());
System.out.println("post返回结果:" + response.getBody());
}
2.3、POST请求(发送JSON数据)
public static void post2() {
String requestPath = "http://localhost:8080/demo/httptest/addUser";
RestTemplate template = new RestTemplate();
template.getMessageConverters().set(1, new StringHttpMessageConverter(Charset.forName("UTF-8")));
String param = "{\"userId\": \"1001\",\"userName\":\"杜甫\"}";
HttpHeaders headers = new HttpHeaders();
headers.add("Content-Type", "application/json");
HttpEntity<String> entity = new HttpEntity<String>(param, headers);
ResponseEntity<String> response = template.postForEntity(requestPath, entity, String.class);
System.out.println("post json返回状态:" + response.getStatusCode());
System.out.println("post json返回结果:" + response.getBody());
}
2.4、上传文件
public static void upload() {
String requestPath = "http://localhost:8080/demo/httptest/upload";
RestTemplate template = new RestTemplate();
template.getMessageConverters().set(1, new StringHttpMessageConverter(Charset.forName("UTF-8")));
HttpHeaders headers = new HttpHeaders();
headers.add("Content-Type", "file/*");
HttpEntity<FileSystemResource> entity = new HttpEntity<FileSystemResource>(new FileSystemResource("d:/a.jpg"), headers);
ResponseEntity<String> response = template.postForEntity(requestPath, entity, String.class);
System.out.println("upload返回状态:" + response.getStatusCode());
System.out.println("upload返回结果:" + response.getBody());
}
2.5、上传文件及发送键值对数据
public static void mulit() {
String requestPath = "http://localhost:8080/demo/httptest/multi";
RestTemplate template = new RestTemplate();
template.getMessageConverters().set(1, new StringHttpMessageConverter(Charset.forName("UTF-8")));
MultiValueMap<String, Object> map = new LinkedMultiValueMap <String, Object>();
map.add("param1", "参数1");
map.add("param2", "参数2");
map.add("file", new FileSystemResource("d:/a.jpg"));
ResponseEntity<String> response = template.postForEntity(requestPath, map, String.class);
System.out.println("mulit返回状态:" + response.getStatusCode());
System.out.println("mulit返回结果:" + response.getBody());
}
2.6、完整例子
package com.inspur.demo.http.client; import java.nio.charset.Charset; import org.springframework.core.io.FileSystemResource;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.ResponseEntity;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate; /**
*
* 通过RestTemplate调用Http接口
*
*/
public class RestTemplateCase {
/**
* GET请求
*/
public static void get() {
try {
String requestPath = "http://localhost:8080/demo/httptest/getUser?userId=1000&userName=李白";
RestTemplate template = new RestTemplate();
//System.out.println(template.getMessageConverters());
//第二个为StringHttpMessageConverter
template.getMessageConverters().set(1, new StringHttpMessageConverter(Charset.forName("UTF-8")));
ResponseEntity<String> response = template.getForEntity(requestPath, String.class);
System.out.println("get返回状态:" + response.getStatusCode());
System.out.println("get返回结果:" + response.getBody());
} catch (Exception e) {
e.printStackTrace();
}
} /**
* POST请求(发送键值对数据)
*/
public static void post() {
String requestPath = "http://localhost:8080/demo/httptest/getUser";
RestTemplate template = new RestTemplate();
template.getMessageConverters().set(1, new StringHttpMessageConverter(Charset.forName("UTF-8")));
MultiValueMap<String, String> map = new LinkedMultiValueMap <String, String>();
map.add("userId", "1000");
map.add("userName", "李白");
ResponseEntity<String> response = template.postForEntity(requestPath, map, String.class);
System.out.println("post返回状态:" + response.getStatusCode());
System.out.println("post返回结果:" + response.getBody());
} /**
* POST请求(发送json数据)
*/
public static void post2() {
String requestPath = "http://localhost:8080/demo/httptest/addUser";
RestTemplate template = new RestTemplate();
template.getMessageConverters().set(1, new StringHttpMessageConverter(Charset.forName("UTF-8"))); String param = "{\"userId\": \"1001\",\"userName\":\"杜甫\"}";
HttpHeaders headers = new HttpHeaders();
headers.add("Content-Type", "application/json");
HttpEntity<String> entity = new HttpEntity<String>(param, headers);
ResponseEntity<String> response = template.postForEntity(requestPath, entity, String.class);
System.out.println("post json返回状态:" + response.getStatusCode());
System.out.println("post json返回结果:" + response.getBody());
} /**
* 上传文件
*/
public static void upload() {
String requestPath = "http://localhost:8080/demo/httptest/upload";
RestTemplate template = new RestTemplate();
template.getMessageConverters().set(1, new StringHttpMessageConverter(Charset.forName("UTF-8")));
HttpHeaders headers = new HttpHeaders();
headers.add("Content-Type", "file/*");
HttpEntity<FileSystemResource> entity = new HttpEntity<FileSystemResource>(new FileSystemResource("d:/a.jpg"), headers); ResponseEntity<String> response = template.postForEntity(requestPath, entity, String.class);
System.out.println("upload返回状态:" + response.getStatusCode());
System.out.println("upload返回结果:" + response.getBody());
} /**
* 上传文件及发送键值对数据
*/
public static void mulit() {
String requestPath = "http://localhost:8080/demo/httptest/multi";
RestTemplate template = new RestTemplate();
template.getMessageConverters().set(1, new StringHttpMessageConverter(Charset.forName("UTF-8")));
MultiValueMap<String, Object> map = new LinkedMultiValueMap <String, Object>();
map.add("param1", "参数1");
map.add("param2", "参数2");
map.add("file", new FileSystemResource("d:/a.jpg"));
ResponseEntity<String> response = template.postForEntity(requestPath, map, String.class);
System.out.println("mulit返回状态:" + response.getStatusCode());
System.out.println("mulit返回结果:" + response.getBody());
} public static void main(String[] args) {
get();
post();
post2();
upload();
mulit();
}
}
3、调用Https接口
与调用Http接口不一样的部分主要在设置ssl部分,设置方法是扩展SimpleClientHttpRequestFactory并在prepareConnection方法中进行ssl的设置;ssl的设置与HttpsURLConnection很相似(参见Java调用Http/Https接口(2)--HttpURLConnection/HttpsURLConnection调用Http/Https接口);下面用GET请求来演示ssl的设置,其他调用方式类似。
package com.inspur.demo.http.client; import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.nio.charset.Charset;
import java.security.KeyStore;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate; import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.KeyManager;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.TrustManagerFactory;
import javax.net.ssl.X509TrustManager; import org.springframework.http.ResponseEntity;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.web.client.RestTemplate; import com.inspur.demo.common.util.FileUtil; /**
* 通过RestTemplate调用Https接口
*/
public class RestTemplateHttpsCase {
public static void main(String[] args) {
try {
/*
* 请求有权威证书的地址
*/
String requestPath = "https://www.baidu.com/";
RestTemplate template = new RestTemplate();
template.getMessageConverters().set(1, new StringHttpMessageConverter(Charset.forName("UTF-8")));
ResponseEntity<String> response = template.getForEntity(requestPath, String.class);
System.out.println("get1返回结果:" + response.getBody()); /*
* 请求自定义证书的地址
*/
//获取信任证书库
KeyStore trustStore = getkeyStore("jks", "d:/temp/cacerts", "123456"); //不需要客户端证书
requestPath = "https://10.40.x.x:9010/zsywservice";
template = new RestTemplate(new HttpsClientRequestFactory(trustStore));
template.getMessageConverters().set(1, new StringHttpMessageConverter(Charset.forName("UTF-8")));
response = template.getForEntity(requestPath, String.class);
System.out.println("get2返回结果:" + response.getBody()); //需要客户端证书
requestPath = "https://10.40.x.x:9016/zsywservice";
KeyStore keyStore = getkeyStore("pkcs12", "d:/client.p12", "123456");
template = new RestTemplate(new HttpsClientRequestFactory(keyStore, "123456", trustStore));
template.getMessageConverters().set(1, new StringHttpMessageConverter(Charset.forName("UTF-8")));
response = template.getForEntity(requestPath, String.class);
System.out.println("get3返回结果:" + response.getBody());
} catch (Exception e) {
e.printStackTrace();
}
} /**
* 获取证书
* @return
*/
private static KeyStore getkeyStore(String type, String filePath, String password) {
KeyStore keySotre = null;
FileInputStream in = null;
try {
keySotre = KeyStore.getInstance(type);
in = new FileInputStream(new File(filePath));
keySotre.load(in, password.toCharArray());
} catch (Exception e) {
e.printStackTrace();
} finally {
FileUtil.close(in);
}
return keySotre;
} /**
* 扩展SimpleClientHttpRequestFactory以支持Https
*/
private static class HttpsClientRequestFactory extends SimpleClientHttpRequestFactory {
private KeyStore keyStore;
private String keyStorePassword;
private KeyStore trustStore; public HttpsClientRequestFactory(KeyStore keyStore, String keyStorePassword, KeyStore trustStore) {
this.keyStore = keyStore;
this.keyStorePassword = keyStorePassword;
this.trustStore = trustStore;
} public HttpsClientRequestFactory(KeyStore trustStore) {
this.trustStore = trustStore;
} @Override
protected void prepareConnection(HttpURLConnection connection, String httpMethod) throws IOException {
try {
if (!(connection instanceof HttpsURLConnection)) {
throw new RuntimeException("An instance of HttpsURLConnection is expected");
}
HttpsURLConnection httpsConnection = (HttpsURLConnection) connection; KeyManager[] keyManagers = null;
TrustManager[] trustManagers = null;
if (this.keyStore != null) {
KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance("SunX509");
keyManagerFactory.init(keyStore, keyStorePassword.toCharArray());
keyManagers = keyManagerFactory.getKeyManagers();
}
if (this.trustStore != null) {
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance("SunX509");
trustManagerFactory.init(trustStore);
trustManagers = trustManagerFactory.getTrustManagers();
} else {
trustManagers = new TrustManager[] { new DefaultTrustManager()};
} SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(keyManagers, trustManagers, null);
httpsConnection.setSSLSocketFactory(sslContext.getSocketFactory());
//验证URL的主机名和服务器的标识主机名是否匹配
httpsConnection.setHostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String s, SSLSession sslSession) {
//if ("xxx".equals(hostname)) {
// return true;
//} else {
// return false;
//}
return true;
}
}); super.prepareConnection(httpsConnection, httpMethod);
} catch (Exception e) {
e.printStackTrace();
}
}
} private static final class DefaultTrustManager implements X509TrustManager {
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
} @Override
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
} @Override
public X509Certificate[] getAcceptedIssuers() {
return null;
}
}
}
4、AsyncRestTemplate
该模板已过时,建议使用WebClient替代。
Java调用Http/Https接口(6)--RestTemplate调用Http/Https接口的更多相关文章
- Java WebService接口生成和调用 图文详解>【转】【待调整】
webservice简介: Web Service技术, 能使得运行在不同机器上的不同应用无须借助附加的.专门的第三方软件或硬件, 就可相互交换数据或集成.依据Web Service规范实施的应用之间 ...
- c#代码 天气接口 一分钟搞懂你的博客为什么没人看 看完python这段爬虫代码,java流泪了c#沉默了 图片二进制转换与存入数据库相关 C#7.0--引用返回值和引用局部变量 JS直接调用C#后台方法(ajax调用) Linq To Json SqlServer 递归查询
天气预报的程序.程序并不难. 看到这个需求第一个想法就是只要找到合适天气预报接口一切都是小意思,说干就干,立马跟学生沟通价格. 不过谈报价的过程中,差点没让我一口老血喷键盘上,话说我们程序猿的人 ...
- java通过HttpClient方式和HttpURLConnection方式调用WebService接口
1.引入maven依赖: <dependency> <groupId>org.apache.httpcomponents</groupId> <artifac ...
- java接口对接——别人调用我们接口获取数据
java接口对接——别人调用我们接口获取数据,我们需要在我们系统中开发几个接口,给对方接口规范文档,包括访问我们的接口地址,以及入参名称和格式,还有我们的返回的状态的情况, 接口代码: package ...
- .net WebServer示例及调用(接口WSDL动态调用 JAVA)
新建.asmx页面 using System; using System.Collections.Generic; using System.Linq; using System.Web; using ...
- 从Java future 到 Guava ListenableFuture实现异步调用
从Java future 到 Guava ListenableFuture实现异步调用 置顶 2016年04月24日 09:11:14 皮斯特劳沃 阅读数:17570 标签: java异步调用线程非阻 ...
- 使用Socket&反射&Java流操作进行方法的远程调用(模拟RPC远程调用)
写在前面 阅读本文首先得具备基本的Socket.反射.Java流操作的基本API使用知识:否则本文你可能看不懂... 服务端的端口监听 进行远程调用,那就必须得有客户端和服务端.服务端负责提供服务,客 ...
- java多态的实现原理(JVM调用过程)(综合多篇文章,参考见文末)
一个对象变量可以指示多种实际类型的现象称为多态 允许不同类的对象对同一消息做出响应.方法的重载.类的覆盖正体现了多态. 1.多态的机制 1.1 本质上多态分两种 1.编译时多态(又称静态多态) 2.运 ...
- Atitit java c# php c++ js跨语言调用matlab实现边缘检测等功能attilax总结
Atitit java c# php c++ js跨语言调用matlab实现边缘检测等功能attilax总结 1.1. 边缘检测的基本方法Canny最常用了1 1.2. 编写matlab边缘检测代码, ...
随机推荐
- arris1750 pandorabox安装bandwidthd之后带宽监控(nlbwmon)报资源不足
nlbwmon 报错资源不足不能看的原因很可能是内存不足导致,因为重启进程会概率可用一下,且删除老的数据后又好用了. 可能与设置的最大数据库条数有关,条数过大导致申请内存大,改成默认的10000. 可 ...
- IntelliJ IDEA 运行你的第一个Java应用程序 idea运行main方法
IntelliJ IDEA 运行你的第一个Java应用程序创建项目让我们创建一个简单的Java Hello World项目. 单击创建新的项目. 打开新建项目向导.你应该注意的主要是项目的SDK.SD ...
- 2019年MTP管理技能提升培训笔记
2019年MTP管理技能提升培训笔记 管理专题培训–MTP管理技能提升培训 高水准的问题分析解决 何为高水准 高 多层探寻,高度分析,即需要有深度 水 团队讨论,水平思考,即需要有广度 准 预防应变, ...
- [转]vscodesvn安装和使用
原文链接:https://blog.csdn.net/wzh66888/article/details/90145340 1.安装svn插件 2.安装成功后会出现这样的图标 如果没有安装之后不能使用, ...
- django注释
转自https://www.cnblogs.com/dayouzi/p/10154815.html Django在HTML里面书写的模板语言不能使用这种方法注释,这样注释实际依然有效 <!--{ ...
- 【GMT43智能液晶模块】例程十六:LAN_TCPS实验——以太网数据传输
源代码下载链接: 链接:https://pan.baidu.com/s/1e5Qp-xASjlA0pje3S7TdIg提取码:9v37 复制这段内容后打开百度网盘手机App,操作更方便哦 GMT43购 ...
- git清除master分支所有commit
原理:新切一个分支并切换到这个分支,删除原来的master分支,再将新分支变成master 步骤: 1. 创建并切换到新分支 git checkout --orphan latest_branch 2 ...
- Transaction-Mybatis源码
github地址:https://github.com/dchack/Mybatis-source-code-learn (欢迎star) TransactionFactory 官方文档: 在 MyB ...
- EasyDSS高性能RTMP、HLS(m3u8)、HTTP-FLV、RTSP流媒体服务器功能简介---实时数据统计报表、视频文件上传、点播、分享、集成
熟悉EasyDSS流媒体服务器的小伙伴应该都知道,EasyDSS通过将EasyRTMP推流的直播流进行直播转码.智能处理.视频分发,再通过 CDN 分发节点分发到终端播放 SDK为观众播放高清低延时的 ...
- 《设计模式》读懂UML类图
一.类中的主要关系 继承.实现.组合.聚合.依赖.关联 二.UML类图 三.代码实现 public class H2O { } public class O2 { } public interface ...