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)這樣就可以了

其實JacksonGson都可以把字符串轉成自定義的對象,大家都可以去了解下,我只是推薦使用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"
}
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容