您好,登錄后才能下訂單哦!
如何在Java中使用Feign發(fā)送一個HTTP請求?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。
引入依賴
首先,我們需要將 Feign 的基礎(chǔ)依賴引入項目,因為我們只使用 Feign 的 remote 功能,因此,只引入基礎(chǔ)依賴。
此外在項目中,我們還自定義了了 JSON 轉(zhuǎn)換和 log 設(shè)置,因此還需要引入這些的第三方依賴,如下所示。
<!-- feign --> <dependency> <groupId>io.github.openfeign</groupId> <artifactId>feign-core</artifactId> <version>10.10.1</version> </dependency> <dependency> <groupId>io.github.openfeign</groupId> <artifactId>feign-gson</artifactId> <version>10.10.1</version> </dependency> <dependency> <groupId>io.github.openfeign</groupId> <artifactId>feign-slf4j</artifactId> <version>10.10.1</version> </dependency>
發(fā)送路徑和方法設(shè)置
然后,因為 Feign 是一種申明式的調(diào)用,因此我們需要配置發(fā)送的接口路徑和發(fā)送接口定義,看下面的例子。
@RequestLine("GET /user/getone?arkOrgId={arkOrgId}&userId={userId}") JSONObject getOneStaff(@Param("arkOrgId") String arkOrgId,@Param("userId") String userId); @RequestLine("POST /user/add") @Headers("Content-Type: application/json") @Body("{body}") JSONObject saveStaff(@Param("body") SaveEmployeeDTO saveEmployeeDTO);
在代碼實例中,我們定義了兩種發(fā)送的實例,一種是 GET 請求,一種是 POST 請求,下面,我們分別來看一下其中的代碼的作用是什么。
POST 請求,需要在實體中重寫 toString() 方法,使其在發(fā)送時調(diào)用該方法后,是一個 JSON 字符串,詳細(xì)見后文 Tips 中寫的。
定義發(fā)送客戶端
@Configuration public class FeignConfig { public static final String DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss"; @Value("${staff.base.url}") private String staffBaseUrl; @Bean public StaffFeignService staffFeignService() { GsonBuilder builder = new GsonBuilder(); builder.setDateFormat(DATE_TIME_FORMAT); return Feign.builder() .retryer(closeFeignRetry()) .decoder(new GsonDecoder(builder.create())) .encoder(new GsonEncoder()) .logger(new Slf4jLogger()) .logLevel(Logger.Level.FULL) .target(StaffFeignService.class, staffBaseUrl); } /** * 關(guān)閉feign的失敗重試功能 */ @Bean public Retryer closeFeignRetry() { return Retryer.NEVER_RETRY; } @Bean public Request.Options options() { return new Request.Options(15000, 30000); } }
緊接著,我們來定義發(fā)送客戶端。
首先,我們采用 @Value 來動態(tài)添加路由,這樣,就可以根據(jù)在配置文件中的屬性來添加 context path,從而做到可拓展。
然后,feign 的很多配置都是可以根據(jù)自身項目需要在 DIY 的,因此在這里,我們配置了編解碼采用 GSON 的編解碼器,日志級別設(shè)置全打印。通過該設(shè)置來生成一個 Feign 客戶端。
Feign 官方文檔,在官方文檔中,有詳細(xì)的配置說明,根據(jù)自身需要使用,即可。
使用
@Autowired StaffFeignService staffFeignService; // get 請求 JSONObject saveSingleQrCode = staffFeignService.saveSingleQrCode(userId); // post 請求 SaveMultiQrCodesDTO saveMultiQrCodesDTO = new SaveMultiQrCodesDTO();; JSONObject saveMultiQrCodes = staffFeignService.saveMultiQrCodes(saveMultiQrCodesDTO);
通過該方式,即可發(fā)送對應(yīng)請求。
Tips
記錄一些在使用中的重點,需要注意。
重寫 toString() 方法
在發(fā)送 JSON 時,需要重寫 toString() 方法,否則會導(dǎo)致接受方,無法用 json 進(jìn)行解析。
@Override public String toString() { return JSON.toJSONString(this); }
異步客戶端
有時候,我們使用異步發(fā)送,從而不影響我們的主體業(yè)務(wù),F(xiàn)eign 也支持該種配置。
@Bean public IHermesFeignService hermesFeignService() { GsonBuilder builder = new GsonBuilder(); builder.setDateFormat(DATE_TIME_FORMAT); return AsyncFeign.asyncBuilder() .decoder(new GsonDecoder(builder.create())) .encoder(new GsonEncoder(builder.create())) .logger(new Slf4jLogger()) .logLevel(Logger.Level.FULL) .target(IHermesFeignService.class, hermesBaseUrl); }
重點,就是在構(gòu)建 Feign 時,采用 AsyncFeign.asyncBuilder() 來進(jìn)行構(gòu)建。
看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注億速云行業(yè)資訊頻道,感謝您對億速云的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。