亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

@RequestLine怎么使用及配置

發布時間:2022-07-04 11:53:29 來源:億速云 閱讀:1088 作者:iii 欄目:開發技術

本篇內容介紹了“@RequestLine怎么使用及配置”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

@RequestLine的使用及配置

@RequestLine與其它請求不同,只需要簡單寫請求方式和路徑就能達到請求其它服務的目的。

@FeignClient(value = "feign-server",configuration = FeignConfig.class)  //需要一個配置文件
public interface TestService {
    @RequestLine("POST /feign/test")    //對應請求方式和路徑
    String feign(@RequestBody UserDO userDO);
}
@EnableFeignClients
@SpringBootConfiguration
public class FeignConfig {
    @Bean
    public Contract contract(){
        return new feign.Contract.Default();
    }
}

自定義配置feignClient并使用@RequestLine問題

之前在項目里請求三方服務時,使用的是restTemplate,其在組裝參數上略顯麻煩,其實我們可以使用openFeign自動的組件去請求三方服務,實現更加優雅

步驟

依賴導入這些就不說了,直接進入正題

1. 定義請求接口

其寫法和@FeignClient類似,但要使用來自于openFeign的核心注解@RequestLine,而不是來自MVC的注解@PostMapping、@GetMapping。

public interface DhlApi {
   /**
    * 查詢軌跡
    * @param url
    * @return
    */
   @RequestLine("GET {url}")
   @Headers({
           "Content-Type: application/json",
   })
   DhlActiveQueryResponse queryTrack(@Param("url") String url);
}

2. 定義配置文件,配置請求接口

@Configuration
public class TestFeignConfig {
	// 獲取配置文件,自己用的是apollo
    @ApolloJsonValue("${test.api}")
    private TestISVInfo testIsvInfo;
    @Bean
    public TestISVInfo testIsvApi() throws Exception {
        return Feign.builder()
                .client(client())
                .encoder(new FastJsonEncoder())
                .decoder(new FastJsonDecoder())
                // 連接超時30秒,讀取超時60秒
                .options(new Request.Options(30 * 1000, 60 * 1000))
                // 配置日志
                .logger(new Slf4jLogger(TestFeignConfig.class))
                // 發生IO異常重試5次,每次重試最小間隔100ms,最大間隔1s,隨著重試次數遞增
                .retryer(new Retryer.Default())
                .logLevel(Logger.Level.FULL)
                // 注冊feign
                .target(TestIsv.class, testIsvInfo.getDomainUrl());
    }
    private Client client() throws Exception {
    	// 信任策略,設置為無條件信任
        TrustStrategy acceptingTrustStrategy = (cert, authType) -> true;
        // 設置ssl配置,由于我們采用無條件信任,所以也不需要加載證書
        SSLContext sslContext = SSLContexts.custom().loadTrustMaterial(null, acceptingTrustStrategy).build();
        // 使用NoopHostnameVerifier關閉ssl的校驗
        SSLConnectionSocketFactory sslScoketFactory = new SSLConnectionSocketFactory(sslContext,
                NoopHostnameVerifier.INSTANCE);
		
        Registry<ConnectionSocketFactory> socketFactoryRegistry =
                RegistryBuilder.<ConnectionSocketFactory>create()
                        .register("https", sslScoketFactory)
                        .register("http", new PlainConnectionSocketFactory())
                        .build();
        PoolingHttpClientConnectionManager connectionManager =
                new PoolingHttpClientConnectionManager(socketFactoryRegistry);
        CloseableHttpClient httpClient = HttpClients
                .custom()
                .setMaxConnTotal(20)
                .setMaxConnPerRoute(20)
                .setSSLSocketFactory(sslScoketFactory)
                .evictExpiredConnections()
                .evictIdleConnections(20, TimeUnit.SECONDS)
                .setConnectionManager(connectionManager).build();
        return new ApacheHttpClient(httpClient);
    }
}

結束!就這么簡單。

為什么用的是@RequestLine

這和open-feign的Contract設計有關系,Contract是一個注解解析接口,它決定了接口可以使用什么注解轉換到http請求。open-feign在使用@FeignClient的情況下,使用的是SpringMvcContract,它使得被@FeignClient修飾的接口,可以使用@GetMapping,@PostMapping等Spring Mvc注解。

如果我們要使用@RequestLine,則需要替換open-Feign的MVC解析器,像這樣

// 在feign上寫上配置
@FeignClient(name = "test-center", configuration = TestFeignConfig .class)
// 配置類
@Configuration
public class TestFeignConfig {
	// 配置feign的注釋解析器為feign默認解析器而不是mvc解析器
    @Bean
    public Contract feignContract() {
        return new feign.Contract.Default();
    }
}

如果我們不單獨配置,則會使用FeignClientsConfiguration中默認配置的SpringMvcContract。

@Bean
@ConditionalOnMissingBean
public Contract feignContract(ConversionService feignConversionService) {
	return new SpringMvcContract(this.parameterProcessors, feignConversionService);
}

那為什么我們通過@Bean形式注冊的feign客戶端就能直接使用@RequestLine呢。因為@Bean形式注冊的feign客戶端不會使用這個配置,而是使用open-feign的默認Contract

打開這個類,我們可以看到它的描述,它的作用可以分為兩個:

  • 定義哪些注解在feign接口上是有校的

  • 定義接口的動作

@RequestLine怎么使用及配置

它的processAnnotationOnMethod(MethodMetadata,Annotation, Method)方法,作用就是解析在feign接口上的注解,并轉化為發送http請求需要的數據。

@RequestLine怎么使用及配置

方法代碼:

@RequestLine怎么使用及配置

該類的該方法,只會處理@Body、@RequestLine和@Header 3個注解,如果不是的話,會直接跳過。 針對@RequestLIne

獲取RequstLine的value,使用正則表達式判斷值是否是“GET xxxx”這類的形式,不是就報錯。解析到之后,獲得方法和uri設置進RequestTemplate中針對@Body

將@Body中的值塞到RequestTemplate的body中針對@Headers

獲取@Header中的值,進行解析,并放入RequestTemplate的Header中

“@RequestLine怎么使用及配置”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

漳浦县| 南阳市| 怀仁县| 郧西县| 蕲春县| 宁明县| 六枝特区| 炉霍县| 汝州市| 山阴县| 城固县| 奉化市| 渭源县| 龙江县| 聂拉木县| 通化市| 剑阁县| 卓资县| 瑞昌市| 邛崃市| 滦南县| 罗源县| 余干县| 贡觉县| 平武县| 蓬莱市| 闸北区| 怀柔区| 岗巴县| 封丘县| 邯郸县| 汉中市| 从化市| 阿拉善盟| 大厂| 北流市| 沭阳县| 自贡市| 时尚| 石城县| 张掖市|