HTTP对接方式
对接HTTP接口主要有两种方式
使用httpUtil方式使用RestTempalate方式
一、HTTP方式
当前方式主要是通过构造HTTP请求进行对第三方接口进行调用,返回JSON数据,为了方便起见可以使用HTTPUtil对常用的请求方式进行封装,在进行调用时直接传参构造请求即可。
HTTPUtils方式之Get请求
@Test
void test() throws IOException {
String url;
String requestUrl = UrlConstant.WeatherUrl;
String appid = "57847229";
String appsecret = "jN4fUx1a";
String lng = "114.302953";
String lat = "30.585411";
url = String.format("%s?appid=%s&appsecret=%s&lng=%s&lat=%s&version=v11",
requestUrl,
appid,
appsecret,
lng,
lat);
//这里构造了url,也可直接使用String类型直接定义url
//String url = "https://v0.yiketianqi.com/api?appid=57847229&appsecret=jN4fUx1a&lng=114.302953&lat=30.585411&version=v11";
log.warn(url);
//使用httpUtil方式
String s = HttpUtil.get(url);
log.info(s);
}
输出格式化后的JSON数据:得到的JSON数据可以使用FastJson或者GSON进行格式化解析,该技术非本篇主要内容,若使用FastJson有问题请自行Google/百度
{
"errcode":0,
"time":"2020-10-05 15:10:00",
"update_time":"2020-10-05 15:05:00",
"msg":"30分钟后开始下小雨,不过100分钟后雨就停了",
"data":[
{
"time":"2020-10-05 15:20:00",
"level":"",
"value":"0"
},
{
"time":"2020-10-05 15:25:00",
"level":"",
"value":"0"
},
{
"time":"2020-10-05 15:30:00",
"level":"",
"value":"0"
},
{
"time":"2020-10-05 15:35:00",
"level":"",
"value":"0"
},
{
"time":"2020-10-05 15:40:00",
"level":"",
"value":"0"
},
{
"time":"2020-10-05 15:45:00",
"level":"",
"value":"0"
},
{
"time":"2020-10-05 15:50:00",
"level":"小雨",
"value":"0.03"
},
{
"time":"2020-10-05 15:55:00",
"level":"小雨",
"value":"0.06"
},
{
"time":"2020-10-05 16:00:00",
"level":"小雨",
"value":"0.09"
},
{
"time":"2020-10-05 16:05:00",
"level":"小雨",
"value":"0.11"
},
{
"time":"2020-10-05 16:10:00",
"level":"小雨",
"value":"0.13"
},
{
"time":"2020-10-05 16:15:00",
"level":"小雨",
"value":"0.14"
},
{
"time":"2020-10-05 16:20:00",
"level":"小雨",
"value":"0.13"
},
{
"time":"2020-10-05 16:25:00",
"level":"小雨",
"value":"0.13"
},
{
"time":"2020-10-05 16:30:00",
"level":"小雨",
"value":"0.1"
},
{
"time":"2020-10-05 16:35:00",
"level":"小雨",
"value":"0.07"
},
{
"time":"2020-10-05 16:40:00",
"level":"小雨",
"value":"0.05"
},
{
"time":"2020-10-05 16:45:00",
"level":"小雨",
"value":"0.05"
},
{
"time":"2020-10-05 16:50:00",
"level":"小雨",
"value":"0.04"
},
{
"time":"2020-10-05 16:55:00",
"level":"小雨",
"value":"0.06"
},
{
"time":"2020-10-05 17:00:00",
"level":"",
"value":"0"
}
]
}
当前使用的案例是调用一个天气的api,获取天气信息
文档地址:https://www.tianqiapi.com/index/doc
字符串拼接详见:
https://www.cnblogs.com/Dhouse/p/7776780.html
HTTPUtils方式之Post请求
我们首先启动一个Post接口的demo,并启动该demo
本地配置文件没有任何配置,所以请求的地址是:
http://localhost:8080/post/post
@org.springframework
.web
.bind
.annotation
.RestController
@RequestMapping("/post")
public class RestController {
@PostMapping("/post")
public String
post(HttpServletRequest request
,
@RequestParam(value
= "email", required
= false) String email
,
@RequestParam(value
= "nick", required
= false) String nick
) {
Map
<String, Object> map
= new HashMap<>();
map
.put("code", "200");
map
.put("result", "add " + email
+ " # " + nick
+ " success!");
return JSON
.toJSONString(map
);
}
}
使用HTTPUtils以Post方式请求
@Test
void testByPostUtils() throws Exception{
String url = "http://localhost:8080/post/post";
String email = "http://49.232.21.180:8090/";
String nick = "关忆北_Blog";
Map<String, String> request = new HashMap<>();
request.put("email", email);
request.put("nick", nick);
String postForm = HttpUtil.postForm(url, request);
//输出打印:
{"result":"add http://49.232.21.180:8090/ # null success!","code":"200"}
}
二、RestTempalate方式
RestTempalate 简介:
SpringRestTemplate是Spring 提供的用于访问 Rest 服务的客端**(用于发起HTTP请求)**, RestTemplate交由Spring管理,RestTemplate提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率,所以很多客户端比如Android或者第三方服务商都是使用RestTemplate 请求 restful服务。
借用网络中的整理的API表格
详情可以查看Spring官网
https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/client/RestTemplate.html
API说明
getForEntity()发送一个HTTP GET请求,返回的ResponseEntity包含了响应体所映射成的对象getForObject()发送一个HTTP GET请求,返回的请求体将映射为一个对象postForEntity()POST 数据到一个URL,返回包含一个对象的ResponseEntity,这个对象是从响应体中映射得到的postForObject()POST 数据到一个URL,返回根据响应体匹配形成的对象headForHeaders()发送HTTP HEAD请求,返回包含特定资源URL的HTTP头optionsForAllow()发送HTTP OPTIONS请求,返回对特定URL的Allow头信息postForLocation()POST 数据到一个URL,返回新创建资源的URLput()PUT 资源到特定的URLdelete()在特定的URL上对资源执行HTTP DELETE操作exchange()在URL上执行特定的HTTP方法,返回包含对象的ResponseEntity,这个对象是从响应体中映射得到的execute()在URL上执行特定的HTTP方法,返回一个从响应体映射得到的对象
getForObject函数实际上是对getForEntity函数的进一步封装,如果你只关注返回的消息体的内容,对其他信息都不关注,此时可以使用getForObject。
RestTempalate 配置:
使用RestTempalate之前需要对其进行配置,否则会无法注入到Spring中,即使用时,restTempalate是null;将RestTemplate使用@Configuration注解配置:
@Configuration
public class RestTemplateConfig {
@Bean
public RestTemplate
restTemplate(ClientHttpRequestFactory factory
) {
return new RestTemplate(factory
);
}
@Bean
public ClientHttpRequestFactory
simpleClientHttpRequestFactory() {
SimpleClientHttpRequestFactory factory
= new SimpleClientHttpRequestFactory();
factory
.setReadTimeout(5000);
factory
.setConnectTimeout(5000);
return factory
;
}
}
更为详尽的配置请参考以下方式:
https://www.jianshu.com/p/2cc999c0b99d
RestTempalate引入使用:
@Autowired
public RestTemplate restTemplate
;
RestTempalate方式之Get请求
@Test
void test() throws IOException
{
String url
;
String requestUrl
= UrlConstant
.WeatherUrl
;
String appid
= "57847229";
String appsecret
= "jN4fUx1a";
String lng
= "114.302953";
String lat
= "30.585411";
url
= String
.format("%s?appid=%s&appsecret=%s&lng=%s&lat=%s&version=v11",
requestUrl
,
appid
,
appsecret
,
lng
,
lat
);
log
.warn(url
);
Weather weather
= restTemplate
.getForObject(url
, Weather
.class);
log
.info(weather
.toString());
log
.info(s
);
}
输出:
Weather(errcode
=0, time
=2020-10-05 16:11:00, update_time
=2020-10-05 16:05:00, msg
=10分钟后雨渐停,不过
30分钟后又开始下小雨
, data
=[WeatherData(time
=2020-10-05 16:20:00, level
=小雨
, value
=0.12), WeatherData(time
=2020-10-05 16:25:00, level
=小雨
, value
=0.06), WeatherData(time
=2020-10-05 16:30:00, level
=, value
=0), WeatherData(time
=2020-10-05 16:35:00, level
=, value
=0), WeatherData(time
=2020-10-05 16:40:00, level
=, value
=0), WeatherData(time
=2020-10-05 16:45:00, level
=, value
=0), WeatherData(time
=2020-10-05 16:50:00, level
=小雨
, value
=0.04), WeatherData(time
=2020-10-05 16:55:00, level
=小雨
, value
=0.06), WeatherData(time
=2020-10-05 17:00:00, level
=小雨
, value
=0.06), WeatherData(time
=2020-10-05 17:05:00, level
=小雨
, value
=0.01), WeatherData(time
=2020-10-05 17:10:00, level
=, value
=0), WeatherData(time
=2020-10-05 17:15:00, level
=, value
=0), WeatherData(time
=2020-10-05 17:20:00, level
=, value
=0), WeatherData(time
=2020-10-05 17:25:00, level
=, value
=0), WeatherData(time
=2020-10-05 17:30:00, level
=, value
=0), WeatherData(time
=2020-10-05 17:35:00, level
=, value
=0), WeatherData(time
=2020-10-05 17:40:00, level
=, value
=0), WeatherData(time
=2020-10-05 17:45:00, level
=小雨
, value
=0.02), WeatherData(time
=2020-10-05 17:50:00, level
=小雨
, value
=0.04), WeatherData(time
=2020-10-05 17:55:00, level
=小雨
, value
=0.05), WeatherData(time
=2020-10-05 18:00:00, level
=小雨
, value
=0.08)])
可以发现,使用RestTempalate返回的数据是已经解析到对象中的,在入参中,Weather.class可以理解为是一个Json转换器,把JSON数据转换成(序列化)对象。
注:返回的JSON数据必须与转换器实体类的字段一一对应,否则会无法转义。
@lombok.Data
public class Weather implements Serializable {
private String errcode
;
private String time
;
private String update_time
;
private String msg
;
private List
<WeatherData> data
;
}
与之对比,使用RestTempalate发起HTTP请求,无需再使用FastJson或GSON进行解析返回的数据,当获取对象中的变量时可以直接使用getXXX的方式进行获取。
RestTempalate方式之Post请求
@Test
public void testPostLocation() {
String url
= "http://localhost:8080/post/post";
String email
= "http://49.232.21.180:8090/";
String nick
= "关忆北_Blog";
MultiValueMap
<String, String> request
= new LinkedMultiValueMap<>();
request
.add("email", email
);
request
.add("nick", nick
);
URI uri
= restTemplate
.postForLocation(url
, request
);
System
.out
.println(uri
);
}
输出:
{"result":"add http://49.232.21.180:8090/ # 关忆北_Blog success!","code":"200"}
uri参数,使用姿势和get请求中一样,填充uri中模板坑位表单参数,由MultiValueMap封装,同样是kv结构
我已将本demo放置在我的Github中!,欢迎访问
https://github.com/FirstMrRight/abutment
个人网站已同步更新,阅读效果更佳