Springboot用RestTemplate发送http请求
有时候后端需要接收别人的数据时,springboot也可以做到,一般是使用RestTemplate
需要先引入httpclient
依赖
在pom.xml中加入如下代码(版本一般选择比较新的)
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.5</version>
</dependency>
Spring 中如何使用Rest资源
借助 RestTemplate
,Spring应用能够方便地使用REST
资源
Spring的 RestTemplate
访问使用了模版方法的设计模式.
模版方法将过程中与特定实现相关的部分委托给接口,而这个接口的不同实现定义了接口的不同行为.
RestTemplate定义了36个与REST资源交互的方法,其中的大多数都对应于HTTP的方法。
delete()
:这个方法是在特定的URL
上对资源执行HTTP DELETE
操作
exchange()
:在URL上执行特定的HTTP方法,返回包含对象的ResponseEntity
,这个对象是从响应体中映射得到的
execute()
在URL上执行特定的HTTP方法,返回一个从响应体映射得到的对象
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,返回新创建资源的URL
put()
PUT
资源到特定的URL
实际上,由于Post 操作的非幂等性,它几乎可以代替其他的CRUD操作.
关键代码说明
一般获取数据都会写在service业务层
代码使用
RestTemplate restTemplate=new RestTemplate();
使用RestTemplate的话肯定要先把对象new出来
String url="http://www.testXXX.com";
必须 http、https……开头,不然报错,浏览器地址栏不加 http 之类不出错是因为浏览器自动补全了
HttpHeaders headers = new HttpHeaders();
这个对象有add()方法,可往请求头存入信息
headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
解决中文乱码
HttpEntity<String> entity = new HttpEntity<String>(body, headers);
body
是Http消息体,例如json
串
restTemplate.exchange(url, HttpMethod.POST, entity, String.class);
上面这句返回的是往 url发送 post请求 请求携带信息为entity时返回的结果信息
因为返回的是HttpEntity<String>,所以如果要得到字符串不能强转为String,可以exchange().getBody()
获取字符串
String.class
是可以修改的,其实本质上就是在指定反序列化对象类型,这取决于你要怎么解析请求返回的参数
再说一点,可能在项目中比较常用的
当获取到数据后,由于是获取到的是字符串,但是现在你需要的是自定义的对象,所以我建议使用阿里的fastjson,使用的话先引入相关依赖,然后通过fastjson的方法
JSONObject.parseObject(字符串,自定义对象.class)
这样就可以了
其实Jackson
和Gson
都可以把字符串转成自定义的对象,大家都可以去了解下,我只是推荐使用fastjson。
实例
说了这么久,写个具体实例
service中,在controller层获取传入的cityName,然后调用这个方法就可以了
public WeatherResponse getDataByCityName(String cityName) {
String uri="http://wthrcdn.etouch.cn/weather_mini?city="+cityName;
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
HttpEntity<String> entity = new HttpEntity<String>(headers);
String strbody=restTemplate.exchange(uri, HttpMethod.GET, entity,String.class).getBody();
WeatherResponse weatherResponse= JSONObject.parseObject(strbody,WeatherResponse.class);
return weatherResponse;
}
WeatherResponse
为自定义的类,可以用object
代替
restTemplate.exchange().getStatusCodeValue()可以获取相应的返回码,一般判断是否为200
在springboot中还需要对Rest做个简单的配置
@Configuration
public class RestConfiguration {
@Autowired
RestTemplateBuilder builder;
@Bean
public RestTemplate restTemplate(){
return builder.build();
}
}
我们可以在postman中测试看看返回的数据
{
"data": {
"city": "深圳",
"aqi": "54",
"ganmao": "各项气象条件适宜,无明显降温过程,发生感冒机率较低。",
"wendu": "23",
"yesterday": {
"date": "9日星期三",
"high": "高温 26℃",
"fl": "<![CDATA[<3级]]>",
"low": "低温 23℃",
"fx": "无持续风向",
"type": "大雨"
},
"forecast": [
{
"date": "10日星期四",
"high": "高温 26℃",
"low": "低温 23℃",
"fengxiang": "东风",
"type": "中到大雨",
"fengli": "<![CDATA[3-4级]]>"
},
{
"date": "11日星期五",
"high": "高温 28℃",
"low": "低温 23℃",
"fengxiang": "无持续风向",
"type": "多云",
"fengli": "<![CDATA[<3级]]>"
},
{
"date": "12日星期六",
"high": "高温 30℃",
"low": "低温 25℃",
"fengxiang": "无持续风向",
"type": "多云",
"fengli": "<![CDATA[<3级]]>"
},
{
"date": "13日星期天",
"high": "高温 31℃",
"low": "低温 25℃",
"fengxiang": "无持续风向",
"type": "多云",
"fengli": "<![CDATA[<3级]]>"
},
{
"date": "14日星期一",
"high": "高温 31℃",
"low": "低温 25℃",
"fengxiang": "无持续风向",
"type": "多云",
"fengli": "<![CDATA[<3级]]>"
}
]
},
"status": 1000,
"desc": "OK"
}