原生feign呼叫第三方介面
阿新 • • 發佈:2018-11-28
最近做一個小專案,小到只有一個頁面,和幾個介面而已。
因為專案是自己一個人在做,所以所有的定義都可以自己做主。
專案的目的是為了推送給第三方頁面收集到的資料,所以對接是重頭戲。
之前對接過各種第三方簡訊介面,用的無非是httpClient的get/post,用多了就想換一個技術熟悉一下。
一、引入依賴
啥也不說,先引入一堆東西,不是每一個都有用,但是用到了就很方便。
core:是必須要引的,核心依賴。
gson/jackson:gson我的程式碼中有用到,處理json資料。
<dependency> <groupId>io.github.openfeign</groupId> <artifactId>feign-core</artifactId> <version>9.5.0</version> </dependency> <dependency> <groupId>com.netflix.feign</groupId> <artifactId>feign-gson</artifactId> <version>8.18.0</version> </dependency> <dependency> <groupId>io.github.openfeign</groupId> <artifactId>feign-slf4j</artifactId> <version>9.5.0</version> </dependency> <dependency> <groupId>io.github.openfeign</groupId> <artifactId>feign-hystrix</artifactId> <version>9.5.0</version> </dependency> <dependency> <groupId>io.github.openfeign</groupId> <artifactId>feign-jackson</artifactId> <version>9.5.0</version> </dependency>
二、寫介面
下面這個介面是免費的,公開的,所以應該不會涉及到利益問題。
package com.geewise.ddsp.phonecollect.api; import com.alibaba.fastjson.JSONObject; import feign.Param; import feign.RequestLine; import java.net.MalformedURLException; /** * 手機號查詢地區 */ public interface DetailPhoneClient { /** * http://mobsec-dianhua.baidu.com/dianhua_api/open/location?tel=13322222222&qq-pf-to=pcqq.c2c * response:{"response":{"13322222222":{"detail":{"area":[{"city":"大連"}],"province":"遼寧","type":"domestic","operator":"電信"},"location":"遼寧大連電信"}},"responseHeader":{"status":200,"time":1539141421138,"version":"1.1.0"}} * @param tel * @return */ @RequestLine("GET /open/location?tel={tel}&qq-pf-to=pcqq.c2c") JSONObject getDetailByPhone(@Param(value = "tel") String tel); }
三、使用
在controller層中可以直接呼叫,直接上程式碼 。
最重要的地方就是Feign.builder()這一段,下面是判斷,因為是第三方的,不是自己寫的介面,判斷的比較細了,有點囉嗦。
/** * 用手機號查詢所屬地域 * * @param phone 手機號 * @return 所屬地域 */ private String getCityByPhone(String phone) { DetailPhoneClient detailPhoneClient = Feign.builder() .decoder(new GsonDecoder()) .target(DetailPhoneClient.class, "http://mobsec-dianhua.baidu.com/dianhua_api"); JSONObject detailByPhone = detailPhoneClient.getDetailByPhone(phone); logger.info("查詢手機號所屬地區:" + detailByPhone); // 獲取手機號資訊的資料 if (!detailByPhone.containsKey("response")) { return null; } JSONObject response = detailByPhone.getJSONObject("response"); if (!response.containsKey(phone)) { return null; } JSONObject phoneDetail = response.getJSONObject(phone); if (!phoneDetail.containsKey("detail")) { return null; } JSONObject detail = phoneDetail.getJSONObject("detail"); if (!detail.containsKey("area")) { return null; } JSONArray area = detail.getJSONArray("area"); if (area.size() == 0) { return null; } JSONObject cityJsonObject = area.getJSONObject(0); if (!cityJsonObject.containsKey("city")) { return null; } return cityJsonObject.getString("city"); }
四、深入理解
會用了,再來了解一下。
權威的寶典:github-openfeign(由於這個寫的比較通俗易懂,又比較權威,所以程式碼就不copy過來了,省時省力)
1、Gson/Jackson(處理json格式的資料)兩者都包括一個編碼器,一個解碼器
2、Sax/JAXB(處理xml格式的資料,因為我還沒有接觸到這種格式的,畢竟現在json比較流行嘛,只能先寫到這裡,用到再說)
3、OkHttp,JAX-RS,Ribbon(負載均衡),Hystrix(熔斷機制)。這幾個都沒有用到,等用到了 ,再上官網上查吧
4、可以在介面上新增header,具體的可以上githua上面查
@Headers("Content-Type: application/xml")
有時間寫一下和cloud結合的怎麼用