使用聲明式編程生成HTTP客戶端

HttpClient-APT基于Apache HttpClient5開發,不同于Openfeign和Forest的動態代理,該項目通過Java APT生成實現類的代碼。

只需要創建接口interface,為接口添加注解配置HTTP請求信息,APT會在編譯時自動生成實現代碼,類名默認為接口名加Impl后綴,也可以自定義類名。

開源地址:https://github.com/Yeamy/httpclient-apt

1、添加依賴

此處以gradle為例

// 該項目基于 Apache HttpClient5開發
dependencies {
    // 使用gson處理json
    implementation 'io.github.yeamy:httpclient-apt-gson:1.0.3'
    // 或者使用jackson處理json
    //implementation 'io.github.yeamy:httpclient-apt-jackson:1.0.3'
    // 或者使用jackson處理xml
    //implementation 'io.github.yeamy:httpclient-apt-jacksonxml:1.0.3'
    // 啟用注解處理器
    annotationProcessor 'io.github.yeamy:httpclient-apt-gson:1.0.3'
}

2、為interface添加HttpClient注解

使用@HttpClient注解將共有的http請求參數添加到類。

import yeamy.restlite.httpclient.GsonRequestAdapter;
import yeamy.restlite.httpclient.GsonResponseHandler;

@HttpClient(
        serializeAdapter = GsonRequestAdapter.class,// 請求body的序列化適配器
        responseHandler = GsonResponseHandler.class,// http應答數據處理器
        uri = "http://localhost:8080", // 基礎uri
        maxTryTimes = 1,
        header = @Values(name = "user-agent", value = "custom-app/1.0"), // 共用的header
        cookie = {@Values(name = "1", value = "2"), // 共用的cookie
                @Values(name = "3", value = "4")})
public interface DemoClient {// 必須是interface
}

也可以把配置制作成一個模板,供多個類使用

創建模板:創建一個注解,把配置參數添加到注解。

import yeamy.restlite.httpclient.JacksonRequestAdapter;
import yeamy.restlite.httpclient.JacksonResponseHandler;

@HttpClient(
        serializeAdapter = JacksonRequestAdapter.class,
        responseHandler = JacksonResponseHandler.class,
        maxTryTimes = 1,
        uri = "http://localhost:8080",
        header = @Values(name = "user-agent", value = "custom-app/1.0"),
        cookie = {@Values(name = "1", value = "2"),
                @Values(name = "3", value = "4")})
public @interface TemplateClient {
}

使用模板:只需要為接口interface添加模板注解即可

@TemplateClient
// @HttpClient(maxTryTimes = 2) // 可以再次使用HttpClient覆蓋TemplateClient的屬性
public interface DemoClient {// 必須是interface
}

2、使用HttpClientRequest注解創建請求方法

public interface DemoClient {

    @HttpClientRequest(uri = "/baidu")
    Object get();
}

3、聲明變量

  1. 用大括號聲明變量。
  2. 為java方法添加同名參數。
public interface DemoClient {
    @HttpClientRequest(
            uri = "http://localhost:8080/a/{u1}?x={{u2}}",
            headerMap = "{m1}",
            cookieMap = "{m2}",
            header = @Values(name = "h", value = "{h1}"),
            cookie = @Values(name = "v", value = "{c1}"),
            body = {@PartValues(name = "name", value = "{b1}")}
    )
    String getPo(String u1, String u2, String c1, String h1, String b1, Map<?, String> m1, Map<String, String> m2);
}
變量 屬性 用法
{u1} uri 為uri添加變量,該變量將會被URL編碼。
{{u2}} uri 兩個大括號,讓URI變量不被編碼。
{h1} header 為header定義個變量值。
{c1} cookie 為cookie定義變量值。
{m1} headerMap 多個header變量值,通過Map<>傳入。
{m2} cookieMap 多個cookie變量值,通過Map<>傳入。
{b1} body 定義body變量,該變量將被serializeAdapter序列化。

4、屬性是如何被選擇的

相同的屬性將被覆蓋

屬性包括: serializeAdapter, responseHandler, maxTryTimes, protocol, method.

選擇順序: HttpClientRequest > HttpClient > 模板注解

默認HTTP方法:

當http方法未必定義,或者為空字符串時,使用GET,或者POST(如果請求包含body)。

完整的URI由基礎URI加上子URI組成:

基礎uri: HttpClient的uri 或者 TemplateClient的uri.

子uri: HttpClientRequest的uri.

完整uri: 基礎uri + 子uri.

headers和cookies:

全部: HttpClientRequest的屬性集加上HttpClient的屬性集,再加上(如果存在的話)TemplateClient的屬性集。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容