轉自:http://c.biancheng.net/view/5357.html
JAVA 項目中接口調用怎么做?
1)Httpclient
HttpClient 是 Apache Jakarta Common 下的子項目,用來提供高效的、最新的、功能豐富的支持 Http 協議的客戶端編程工具包,並且它支持 HTTP 協議最新版本和建議。
HttpClient 相比傳統 JDK 自帶的 URLConnection,提升了易用性和靈活性,使客戶端發送 HTTP 請求變得容易,提高了開發的效率。
2)Okhttp
一個處理網絡請求的開源項目,是安卓端最火的輕量級框架,由 Square 公司貢獻,用於替代 HttpUrlConnection 和 Apache HttpClient。OkHttp 擁有簡潔的 API、高效的性能,並支持多種協議(HTTP/2 和 SPDY)。
3)HttpURLConnection
HttpURLConnection 是 Java 的標准類,它繼承自 URLConnection,可用於向指定網站發送 GET 請求、POST 請求。HttpURLConnection 使用比較復雜,不像 HttpClient 那樣容易使用。
4)RestTemplate
RestTemplate 是 Spring 提供的用於訪問 Rest 服務的客戶端,RestTemplate 提供了多種便捷訪問遠程 HTTP 服務的方法,能夠大大提高客戶端的編寫效率。
上面介紹的是最常見的幾種調用接口的方法,我們下面要介紹的方法比上面的更簡單、方便,它就是 Feign。
Feign 是一個聲明式的 REST 客戶端,它能讓 REST 調用更加簡單。Feign 供了 HTTP 請求的模板,通過編寫簡單的接口和插入注解,就可以定義好 HTTP 請求的參數、格式、地址等信息。
而 Feign 則會完全代理 HTTP 請求,我們只需要像調用方法一樣調用它就可以完成服務請求及相關處理。
Spring Cloud 對 Feign 進行了封裝,使其支持 SpringMVC 標准注解和 HttpMessageConverters。Feign 可以與 Eureka 和 Ribbon 組合使用以支持負載均衡。
在Spring Cloud中集成Feign
在 Spring Cloud 中集成 Feign 的步驟相當簡單,首先還是加入 Feign 的依賴,代碼如下所示。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
在啟動類上加 @EnableFeignClients 注解,如果你的 Feign 接口定義跟你的啟動類不在同一個包名下,還需要制定掃描的包名 @EnableFeignClients(basePackages=“com.fangjia.api.client”),代碼如下所示。
- @SpringBootApplication
- @EnableDiscoveryClient
- @EnableFeignClients(basePackages = "com.fangjia.api.client")
- public class FshSubstitutionServiceApplication {
- public static void main(String[] args) {
- SpringApplication.run(FshSubstitutionServiceApplication.class, args);
- }
- }
使用Feign調用接口
定義一個 Feign 的客戶端,以接口形式存在,代碼如下所示。
- @FeignClient(value = "eureka-client-user-service")
- public interface UserRemoteClient {
- @GetMapping("/user/hello")
- String hello();
- }
首先我們來看接口上加的 @FeignClient 注解。這個注解標識當前是一個 Feign 的客戶端,value 屬性是對應的服務名稱,也就是你需要調用哪個服務中的接口。
定義方法時直接復制接口的定義即可,當然還有另一種做法,就是將接口單獨抽出來定義,然后在 Controller 中實現接口。
在調用的客戶端中也實現了接口,從而達到接口共用的目的。我這里的做法是不共用的,即單獨創建一個 API Client 的公共項目,基於約定的模式,每寫一個接口就要對應寫一個調用的 Client,后面打成公共的 jar,這樣無論是哪個項目需要調用接口,只要引入公共的接口 SDK jar 即可,不用重新定義一遍了。
定義之后可以直接通過注入 UserRemoteClient 來調用,這對於開發人員來說就像調用本地方法一樣。
接下來采用 Feign 來調用 /user/hello 接口,代碼如下所示。
- @Autowired
- private UserRemoteClient userRemoteClient;
- @GetMapping("/callHello")
- public String callHello() {
- //return restTemplate.getForObject("http://localhost:8083/house/hello",String.class);
- //String result = restTemplate.getForObject("http://eureka-client-user-service/user/hello",String.class);
- String result = userRemoteClient.hello();
- System.out.println("調用結果:" + result);
- return result;
- }
通過跟注釋掉的代碼相比可以發現,我們的調用方式變得越來越簡單了,從最開始的指定地址,到后面通過 Eureka 中的服務名稱來調用,再到現在直接通過定義接口來調用。