有時候后端需要接收別人的數(shù)據(jù)時寒锚,springboot也可以做到,一般是使用RestTemplate
需要先引入httpclient
依賴
在pom.xml中加入如下代碼(版本一般選擇比較新的)
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.5</version>
</dependency>
Spring 中如何使用Rest資源
借助 RestTemplate
壹将,Spring應(yīng)用能夠方便地使用REST
資源
Spring的 RestTemplate
訪問使用了模版方法的設(shè)計模式.
模版方法將過程中與特定實(shí)現(xiàn)相關(guān)的部分委托給接口,而這個接口的不同實(shí)現(xiàn)定義了接口的不同行為.
RestTemplate定義了36個與REST資源交互的方法诽俯,其中的大多數(shù)都對應(yīng)于HTTP的方法。
delete()
:這個方法是在特定的URL
上對資源執(zhí)行HTTP DELETE
操作
exchange()
:在URL上執(zhí)行特定的HTTP方法承粤,返回包含對象的ResponseEntity
,這個對象是從響應(yīng)體中映射得到的
execute()
在URL上執(zhí)行特定的HTTP方法辛臊,返回一個從響應(yīng)體映射得到的對象
getForEntity()
發(fā)送一個HTTP GET
請求,返回的ResponseEntity
包含了響應(yīng)體所映射成的對象
getForObject()
發(fā)送一個HTTP GET
請求彻舰,返回的請求體將映射為一個對象
postForEntity() ``POST
數(shù)據(jù)到一個URL伐割,返回包含一個對象的ResponseEntity
刃唤,這個對象是從響應(yīng)體中映射得到的
postForObject()
POST
數(shù)據(jù)到一個URL,返回根據(jù)響應(yīng)體匹配形成的對象
headForHeaders()
發(fā)送HTTP HEAD
請求尚胞,返回包含特定資源URL的HTTP頭
optionsForAllow()
發(fā)送HTTP OPTIONS
請求硬霍,返回對特定URL的Allow頭信息
postForLocation()
POST
數(shù)據(jù)到一個URL笼裳,返回新創(chuàng)建資源的URL
put()
PUT
資源到特定的URL
實(shí)際上,由于Post 操作的非冪等性,它幾乎可以代替其他的CRUD操作.
關(guān)鍵代碼說明
一般獲取數(shù)據(jù)都會寫在service業(yè)務(wù)層
代碼使用
RestTemplate restTemplate=new RestTemplate();
使用RestTemplate的話肯定要先把對象new出來
String url="http://www.testXXX.com";
必須 http唯卖、https……開頭粱玲,不然報錯,瀏覽器地址欄不加 http 之類不出錯是因為瀏覽器自動補(bǔ)全了
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發(fā)送 post請求 請求攜帶信息為entity時返回的結(jié)果信息
因為返回的是HttpEntity<String>密幔,所以如果要得到字符串不能強(qiáng)轉(zhuǎn)為String,可以exchange().getBody()
獲取字符串
String.class
是可以修改的撩轰,其實(shí)本質(zhì)上就是在指定反序列化對象類型,這取決于你要怎么解析請求返回的參數(shù)
再說一點(diǎn)昧廷,可能在項目中比較常用的
當(dāng)獲取到數(shù)據(jù)后堪嫂,由于是獲取到的是字符串,但是現(xiàn)在你需要的是自定義的對象木柬,所以我建議使用阿里的fastjson皆串,使用的話先引入相關(guān)依賴,然后通過fastjson的方法
JSONObject.parseObject(字符串,自定義對象.class)
這樣就可以了
其實(shí)Jackson
和Gson
都可以把字符串轉(zhuǎn)成自定義的對象眉枕,大家都可以去了解下恶复,我只是推薦使用fastjson。
實(shí)例
說了這么久速挑,寫個具體實(shí)例
service中谤牡,在controller層獲取傳入的cityName,然后調(diào)用這個方法就可以了
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()可以獲取相應(yīng)的返回碼翅萤,一般判斷是否為200
在springboot中還需要對Rest做個簡單的配置
@Configuration
public class RestConfiguration {
@Autowired
RestTemplateBuilder builder;
@Bean
public RestTemplate restTemplate(){
return builder.build();
}
}
我們可以在postman中測試看看返回的數(shù)據(jù)
{
"data": {
"city": "深圳",
"aqi": "54",
"ganmao": "各項氣象條件適宜,無明顯降溫過程腊满,發(fā)生感冒機(jī)率較低套么。",
"wendu": "23",
"yesterday": {
"date": "9日星期三",
"high": "高溫 26℃",
"fl": "<![CDATA[<3級]]>",
"low": "低溫 23℃",
"fx": "無持續(xù)風(fēng)向",
"type": "大雨"
},
"forecast": [
{
"date": "10日星期四",
"high": "高溫 26℃",
"low": "低溫 23℃",
"fengxiang": "東風(fēng)",
"type": "中到大雨",
"fengli": "<![CDATA[3-4級]]>"
},
{
"date": "11日星期五",
"high": "高溫 28℃",
"low": "低溫 23℃",
"fengxiang": "無持續(xù)風(fēng)向",
"type": "多云",
"fengli": "<![CDATA[<3級]]>"
},
{
"date": "12日星期六",
"high": "高溫 30℃",
"low": "低溫 25℃",
"fengxiang": "無持續(xù)風(fēng)向",
"type": "多云",
"fengli": "<![CDATA[<3級]]>"
},
{
"date": "13日星期天",
"high": "高溫 31℃",
"low": "低溫 25℃",
"fengxiang": "無持續(xù)風(fēng)向",
"type": "多云",
"fengli": "<![CDATA[<3級]]>"
},
{
"date": "14日星期一",
"high": "高溫 31℃",
"low": "低溫 25℃",
"fengxiang": "無持續(xù)風(fēng)向",
"type": "多云",
"fengli": "<![CDATA[<3級]]>"
}
]
},
"status": 1000,
"desc": "OK"
}