SpringBoot feign動態(tài)設(shè)置數(shù)據(jù)源(https請求)
1、背景
在使用springboot-feign/spingcloud-feign時,需要在啟動springboot的時候,注入的方式將feigncofing配置好,也就是說項目啟動以后只能有一個數(shù)據(jù)源,且不能修改,在網(wǎng)上找了很多資料沒有找到解決方案(網(wǎng)上應(yīng)該有,只是我沒有找到),后面只能是硬著頭皮看源碼,問題解決,在此記錄一下,希望可以幫到有緣人
2、代碼
其實在這里用的原生的feign,并不是springboot/springcloud封裝的feign,廢話不說,上代碼
public <T> T getRemote(Class<T> apiType, String url, String apiCert, String certPassWord) { // apiCert 是p12文件讀了以后的數(shù)據(jù),可以把p12文件放在本地,我這里是偽代碼了 feign.Client.Default client = FeignClient(apiCert, certPassWord); Decoder decoder = (response, type) -> { final String result = IOUtils.toString(response.body().asInputStream(), StandardCharsets.UTF_8); if (String.class.getName() == type.getTypeName()) { return result; } try { return JSON.parseObject(result, type); } catch (Exception e) { log.error("json parse exception"); } return result; }; ErrorDecoder errorDecoder = (methodKey, response) -> { try { final String result = IOUtils.toString(response.body().asInputStream(), StandardCharsets.UTF_8); log.info("feign client decoder response body : {}", result); throw new SysStatusException(response.status(), result); } catch (IOException e) { log.info("feign client decoder response error {}", e); } throw new BizStatusException(response.status(), BizCommMessage.ERROR_MSG); }; T remote = Feign.builder() .decoder(decoder) .errorDecoder(errorDecoder) .client(url) .target(apiType, client); return remote; } public Client getFeignClient(String apiCert, String certPassWord) { final SSLSocketFactory sslSocketFactory = getSSLSocketFactory(apiCert, certPassWord); feign.Client.Default aDefault = new Client.Default(sslSocketFactory, new NoopHostnameVerifier()); return aDefault; } public static SSLSocketFactory getSSLSocketFactory(String apiCert, String certPassWord) { byte[] bytes = apiCert.getBytes(); try (ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes)) { KeyStore keyStore = KeyStore.getInstance(KEY_STORE_TYPE); keyStore.load(inputStream, certPassWord.toCharArray()); SSLContext sslContext = SSLContexts.custom() // 忽略掉對服務(wù)器端證書的校驗,特別重要,被這行代碼坑過 .loadTrustMaterial((TrustStrategy) (chain, authType) -> true) .loadKeyMaterial(keyStore, certPassWord.toCharArray()) .build(); return sslContext.getSocketFactory(); } catch (IOException e) { log.error("=======init feign client throw IOException======={}", e); } catch (KeyStoreException e) { log.error("=======init feign client throw KeyStoreException======={}", e); } catch (UnrecoverableKeyException e) { log.error("=======init feign client throw UnrecoverableKeyException======={}", e); } catch (CertificateException e) { log.error("=======init feign client throw CertificateException======={}", e); } catch (NoSuchAlgorithmException e) { log.error("=======init feign client throw NoSuchAlgorithmException======={}", e); } catch (KeyManagementException e) { log.error("=======init feign client throw KeyManagementException======={}", e); } return null; }
2.2、 編寫請求方法
public interface TestRemote { @Override @RequestLine("POST /apis/{test}/query") @Headers({"Content-Type: application/json","Accept: application/json"}) @Body("{body}") String query(@Param("test") String test, @Param("body") String body); }
2.3、發(fā)送請求
public static void main(String[] args) { TestRemote testRemote = getRemote(TestRemote.class,String url, String apiCert, String certPassWord); testRemote.query("test","{\"id\":1}"); }
總結(jié):
這樣就可以根據(jù)前端傳來的參數(shù),切換不同的客戶端
本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
解決使用this.getClass().getResource()獲取文件時遇到的坑
這篇文章主要介紹了解決使用this.getClass().getResource()獲取文件時遇到的坑問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-12-12常用校驗注解之@NotNull,@NotBlank,@NotEmpty的區(qū)別及說明
這篇文章主要介紹了常用校驗注解之@NotNull,@NotBlank,@NotEmpty的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01SparkSQL讀取hive數(shù)據(jù)本地idea運行的方法詳解
這篇文章主要介紹了SparkSQL讀取hive數(shù)據(jù)本地idea運行的方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-09-09maven關(guān)于pom文件中的relativePath標(biāo)簽使用
在Maven項目中,子工程通過<relativePath>標(biāo)簽指定父工程的pom.xml位置,以確保正確繼承父工程的配置,這個標(biāo)簽可以配置為默認(rèn)值、空值或自定義值,默認(rèn)情況下,Maven會向上一級目錄尋找父pom;若配置為空值2024-09-09Spring Native實現(xiàn)0.059s啟動一個SpringBoot項目
Spring Native是Spring框架的一個子項目,旨在提供一種將Spring應(yīng)用程序編譯為本地可執(zhí)行文件的方法,從而提高啟動時間和資源效率,本文主要介紹了Spring Native實現(xiàn)0.059s啟動一個SpringBoot項目,感興趣的可以了解一下2024-02-02UniApp?+?SpringBoot?實現(xiàn)微信支付和退款功能
這篇文章主要介紹了UniApp?+?SpringBoot?實現(xiàn)微信支付和退款功能,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-06-06