有時候后端需要接收別人的數據時,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"
}