Springboot用RestTemplate發(fā)送http請求

有時候后端需要接收別人的數(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í)JacksonGson都可以把字符串轉(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"
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市碳蛋,隨后出現(xiàn)的幾起案子胚泌,更是在濱河造成了極大的恐慌,老刑警劉巖肃弟,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件玷室,死亡現(xiàn)場離奇詭異,居然都是意外死亡愕乎,警方通過查閱死者的電腦和手機(jī)阵苇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來感论,“玉大人绅项,你說我怎么就攤上這事”纫蓿” “怎么了快耿?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵囊陡,是天一觀的道長。 經(jīng)常有香客問我撞反,道長,這世上最難降的妖魔是什么搪花? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮吮便,結(jié)果婚禮上幢踏,老公的妹妹穿的比我還像新娘髓需。我一直安慰自己僚匆,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布咧擂。 她就那樣靜靜地躺著檀蹋,像睡著了一般。 火紅的嫁衣襯著肌膚如雪续扔。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天刨啸,我揣著相機(jī)與錄音,去河邊找鬼设联。 笑死灼捂,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的悉稠。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼耀盗,長吁一口氣:“原來是場噩夢啊……” “哼想虎!你這毒婦竟也來了叛拷?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤裙椭,失蹤者是張志新(化名)和其女友劉穎署浩,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瑰抵,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡二汛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年拨拓,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片渣磷。...
    茶點(diǎn)故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖竟宋,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情丘侠,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布蜗字,位于F島的核電站脂新,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏争便。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一滞乙、第九天 我趴在偏房一處隱蔽的房頂上張望孩锡。 院中可真熱鬧亥贸,春花似錦、人聲如沸炕置。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至甚纲,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間介杆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工荆隘, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人椰拒。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓凰荚,卻偏偏與公主長得像,于是被迫代替她去往敵國和親便瑟。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容