Spring-Boot 訪問外部接口的幾種方案總結(jié)

一、簡(jiǎn)介

在Spring-Boot項(xiàng)目開發(fā)中,存在著本模塊的代碼需要訪問外面模塊接口,或外部url鏈接的需求忽妒,針對(duì)這一需求目前存在著三種解決方案,下面將對(duì)這三種方案進(jìn)行整理和說(shuō)明兼贸。

二段直、Spring-Boot項(xiàng)目中訪問外部接口

2.1 方案一 采用原生的Http請(qǐng)求

在代碼中采用原生的http請(qǐng)求,代碼參考如下:

@RequestMapping("/doPostGetJson")

public String doPostGetJson() throws ParseException {

? //此處將要發(fā)送的數(shù)據(jù)轉(zhuǎn)換為json格式字符串

? String jsonText = "{id:1}";

? JSONObject json = (JSONObject) JSONObject.parse(jsonText);

? JSONObject sr = this.doPost(json);

? System.out.println("返回參數(shù):" + sr);

? return sr.toString();

}

public static JSONObject doPost(JSONObject date) {

? HttpClient client = HttpClients.createDefault();

? // 要調(diào)用的接口方法

? String url = "http://192.168.1.101:8080/getJson";

? HttpPost post = new HttpPost(url);

? JSONObject jsonObject = null;

? try {

? ? ? StringEntity s = new StringEntity(date.toString());

? ? ? s.setContentEncoding("UTF-8");

? ? ? s.setContentType("application/json");

? ? ? post.setEntity(s);

? ? ? post.addHeader("content-type", "text/xml");

? ? ? HttpResponse res = client.execute(post);

? ? ? String response1 = EntityUtils.toString(res.getEntity());

? ? ? System.out.println(response1);

? ? ? if (res.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {

? ? ? ? String result = EntityUtils.toString(res.getEntity());// 返回json格式:

? ? ? ? jsonObject = JSONObject.parseObject(result);

? ? ? }

? } catch (Exception e) {

? ? ? throw new RuntimeException(e);

? }

? return jsonObject;

}


2.2 方案二 采用Feign進(jìn)行消費(fèi)

1溶诞、在maven項(xiàng)目中添加依賴

<dependency>

      <groupId>org.springframework.cloud</groupId>

      <artifactId>spring-cloud-starter-feign</artifactId>

      <version>1.2.2.RELEASE</version>

</dependency>


2鸯檬、編寫接口,放置在service層

@FeignClient(url = "${decisionEngine.url}",name="engine")

public interface DecisionEngineService {

  @RequestMapping(value="/decision/person",method= RequestMethod.POST)

  public JSONObject getEngineMesasge(@RequestParam("uid") String uid,@RequestParam("productCode") String productCode);

}


這里的decisionEngine.url 是配置在properties中的 是ip地址和端口號(hào)

decisionEngine.url=http://10.2.1.148:3333

/decision/person 是接口名字

3螺垢、在Java的啟動(dòng)類上加上@EnableFeignClients

@EnableFeignClients //參見此處

@EnableDiscoveryClient

@SpringBootApplication

@EnableResourceServer

public class Application? implements CommandLineRunner {

? ? private static final Logger LOGGER = LoggerFactory.getLogger(Application.class);

? ? @Autowired

? ? private AppMetricsExporter appMetricsExporter;

? ? @Autowired

? ? private AddMonitorUnitService addMonitorUnitService;

? ? public static void main(String[] args) {

? ? ? ? new SpringApplicationBuilder(Application.class).web(true).run(args);

? ? }? ?

}


4喧务、在代碼中調(diào)用接口即可

@Autowired

? ? private DecisionEngineService decisionEngineService ;

? ? decisionEngineService.getEngineMesasge("uid" ,? "productCode");


2.3颜及、方案三 采用RestTemplate方法

在Spring-Boot開發(fā)中,RestTemplate同樣提供了對(duì)外訪問的接口API蹂楣,這里主要介紹Get和Post方法的使用。Get請(qǐng)求提供了兩種方式的接口getForObject 和 getForEntity讯蒲,getForEntity提供如下三種方法的實(shí)現(xiàn)痊土。

Get請(qǐng)求之——getForEntity(Stringurl,Class responseType,Object…urlVariables)

該方法提供了三個(gè)參數(shù),其中url為請(qǐng)求的地址墨林,responseType為請(qǐng)求響應(yīng)body的包裝類型赁酝,urlVariables為url中的參數(shù)綁定,該方法的參考調(diào)用如下:

//http://USER-SERVICE/user?name={1}

getForEntity("http://USER-SERVICE/user?name={1}",String.class,"didi")


Get請(qǐng)求之——getForEntity(String url,Class responseType,Map urlVariables)

該方法提供的參數(shù)中urlVariables的參數(shù)類型使用了Map類型旭等,因此在使用該方法進(jìn)行參數(shù)綁定時(shí)需要在占位符中指定Map中參數(shù)的key值酌呆,該方法的參考調(diào)用如下:

// http://USER-SERVICE/user?name={name)

RestTemplate restTemplate=new RestTemplate();

Map<String,String> params=new HashMap<>();

params.put("name","dada");? //

ResponseEntity<String> responseEntity=restTemplate.getForEntity("http://USERSERVICE/user?name={name}",String.class,params);


Get請(qǐng)求之——getForEntity(URI url,Class responseType)

該方法使用URI對(duì)象來(lái)替代之前的url和urlVariables參數(shù)來(lái)指定訪問地址和參數(shù)綁定。URI是JDK java.net包下的一個(gè)類搔耕,表示一個(gè)統(tǒng)一資源標(biāo)識(shí)符(Uniform Resource Identifier)引用隙袁。參考如下:

RestTemplate restTemplate=new RestTemplate();

UriComponents uriComponents=UriComponentsBuilder.fromUriString(

"http://USER-SERVICE/user?name={name}")

.build()

.expand("dodo")

.encode();

URI uri=uriComponents.toUri();

ResponseEntity<String> responseEntity=restTemplate.getForEntity(uri,String.class).getBody();


Get請(qǐng)求之——getForObject

getForObject方法可以理解為對(duì)getForEntity的進(jìn)一步封裝,它通過HttpMessageConverterExtractor對(duì)HTTP的請(qǐng)求響應(yīng)體body內(nèi)容進(jìn)行對(duì)象轉(zhuǎn)換,實(shí)現(xiàn)請(qǐng)求直接返回包裝好的對(duì)象內(nèi)容。getForObject方法有如下:

getForObject(String url,Class responseType,Object...urlVariables)

getForObject(String url,Class responseType,Map urlVariables)

getForObject(URI url,Class responseType)


Post請(qǐng)求提供有三種方法常侣,postForEntity漓藕、postForObject和postForLocation。其中每種方法都存在三種方法妹卿,postForEntity方法使用如下:

RestTemplate restTemplate=new RestTemplate();

User user=newUser("didi",30);

ResponseEntity<String> responseEntity=restTemplate.postForEntity("http://USER-SERVICE/user",user,String.class); //提交的body內(nèi)容為user對(duì)象,請(qǐng)求的返回的body類型為String

String body=responseEntity.getBody();


postForEntity存在如下三種方法的重載

postForEntity(String url,Object request,Class responseType,Object... uriVariables)

postForEntity(String url,Object request,Class responseType,Map uriVariables)

postForEntity(URI url,Object request,Class responseType)


postForEntity中的其它參數(shù)和getForEntity的參數(shù)大體相同在此不做介紹箱舞。


參考文獻(xiàn)

1.Spring Boot 調(diào)用另外項(xiàng)目的接口方法,傳遞json參數(shù)

2.spring boot 訪問外部http請(qǐng)求

3.Spring學(xué)習(xí)筆記之RestTemplate使用小結(jié)

4.Spring RestTemplate中幾種常見的請(qǐng)求方式

5.spring boot單元測(cè)試之RestTemplate(三)——api詳解

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末拳亿,一起剝皮案震驚了整個(gè)濱河市晴股,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌风瘦,老刑警劉巖队魏,帶你破解...
    沈念sama閱讀 212,542評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異万搔,居然都是意外死亡胡桨,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門瞬雹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)昧谊,“玉大人,你說(shuō)我怎么就攤上這事酗捌∧匚埽” “怎么了涌哲?”我有些...
    開封第一講書人閱讀 158,021評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)尚镰。 經(jīng)常有香客問我阀圾,道長(zhǎng),這世上最難降的妖魔是什么狗唉? 我笑而不...
    開封第一講書人閱讀 56,682評(píng)論 1 284
  • 正文 為了忘掉前任初烘,我火速辦了婚禮,結(jié)果婚禮上分俯,老公的妹妹穿的比我還像新娘肾筐。我一直安慰自己,他們只是感情好缸剪,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,792評(píng)論 6 386
  • 文/花漫 我一把揭開白布吗铐。 她就那樣靜靜地躺著,像睡著了一般杏节。 火紅的嫁衣襯著肌膚如雪唬渗。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,985評(píng)論 1 291
  • 那天奋渔,我揣著相機(jī)與錄音谣妻,去河邊找鬼。 笑死卒稳,一個(gè)胖子當(dāng)著我的面吹牛蹋半,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播充坑,決...
    沈念sama閱讀 39,107評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼减江,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了捻爷?” 一聲冷哼從身側(cè)響起辈灼,我...
    開封第一講書人閱讀 37,845評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎也榄,沒想到半個(gè)月后巡莹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,299評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡甜紫,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,612評(píng)論 2 327
  • 正文 我和宋清朗相戀三年降宅,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片囚霸。...
    茶點(diǎn)故事閱讀 38,747評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡腰根,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出拓型,到底是詐尸還是另有隱情额嘿,我是刑警寧澤瘸恼,帶...
    沈念sama閱讀 34,441評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站册养,受9級(jí)特大地震影響东帅,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜球拦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,072評(píng)論 3 317
  • 文/蒙蒙 一冰啃、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧刘莹,春花似錦、人聲如沸焚刚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)矿咕。三九已至抢肛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間碳柱,已是汗流浹背捡絮。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留莲镣,地道東北人福稳。 一個(gè)月前我還...
    沈念sama閱讀 46,545評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像瑞侮,于是被迫代替她去往敵國(guó)和親的圆。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,658評(píng)論 2 350

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