SpringBoot feign動(dòng)態(tài)設(shè)置數(shù)據(jù)源(https請(qǐng)求)
1、背景
在使用springboot-feign/spingcloud-feign時(shí),需要在啟動(dòng)springboot的時(shí)候,注入的方式將feigncofing配置好,也就是說項(xiàng)目啟動(dòng)以后只能有一個(gè)數(shù)據(jù)源,且不能修改,在網(wǎng)上找了很多資料沒有找到解決方案(網(wǎng)上應(yīng)該有,只是我沒有找到),后面只能是硬著頭皮看源碼,問題解決,在此記錄一下,希望可以幫到有緣人
2、代碼
其實(shí)在這里用的原生的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()
// 忽略掉對(duì)服務(wù)器端證書的校驗(yàn),特別重要,被這行代碼坑過
.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、 編寫請(qǐng)求方法
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ā)送請(qǐng)求
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)文章
Java并發(fā)多線程編程之CountDownLatch的用法
這篇文章主要介紹了Java并發(fā)多線程編程之CountDownLatch的用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06
Java實(shí)現(xiàn)讀取resources目錄下的文件路徑的九種方式
本文主要介紹了Java實(shí)現(xiàn)讀取resources目錄下的文件路徑的九種方式,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04
MybatisPlus?BaseMapper?實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)增刪改查源碼
MybatisPlus?是一款在?Mybatis?基礎(chǔ)上進(jìn)行的增強(qiáng)?orm?框架,可以實(shí)現(xiàn)不寫?sql?就完成數(shù)據(jù)庫(kù)相關(guān)的操作,這篇文章主要介紹了MybatisPlus?BaseMapper?實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)增刪改查源碼解析,需要的朋友可以參考下2023-01-01
SpringBoot實(shí)現(xiàn)Thymeleaf驗(yàn)證碼生成
本文使用SpringBoot實(shí)現(xiàn)Thymeleaf驗(yàn)證碼生成,使用后臺(tái)返回驗(yàn)證碼圖片,驗(yàn)證碼存到session中后端實(shí)現(xiàn)校驗(yàn),前端只展示驗(yàn)證碼圖片。感興趣的可以了解下2021-05-05
springmvc接口接收參數(shù)與請(qǐng)求參數(shù)格式的整理
這篇文章主要介紹了springmvc接口接收參數(shù)與請(qǐng)求參數(shù)格式的整理,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11
Spring BeanPostProcessor源碼示例解析
這篇文章主要為大家介紹了Spring BeanPostProcessor源碼示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01

