當前位置: 妍妍網 > 碼農

一行程式碼搞定Http請求,強得離譜~

2024-06-07碼農

OKHttpUtil

在Java的世界中,Http客戶端之前一直是Apache家的HttpClient占據主導,但是由於此包較為龐大,API又比較難用,因此並不使用很多場景。而新興的OkHttp、Jodd-http固然好用,但是面對一些場景時,學習成本還是有一些的。

很多時候,我們想追求輕量級的Http客戶端,並且追求簡單易用。而OKHttp是一套處理 HTTP 網路請求的依賴庫,由 Square 公司設計研發並開源,目前可以在 Java 和 Kotlin 中使用。

對於 Android App來說,OkHttp 現在幾乎已經占據了所有的網路請求操作,對於伺服器端請求外部介面也是必備的選擇 。針對OKHttp,OkHttpUtil做了一層封裝,使Http請求變得無比簡單。

OKHttpUtil 功能

  • 根據URL自動判斷是請求HTTP還是HTTPS,不需要單獨寫多余的程式碼。

  • 預設情況下Cookie自動記錄,比如可以實作模擬登入,即第一次存取登入URL後後續請求就是登入狀態。

  • 自動辨識304跳轉並二次請求

  • 支持代理配置

  • 支持referer配置

  • 支持User-Agent配置

  • 自動辨識並解壓Gzip格式返回內容

  • 支持springboot 配置檔

  • 極簡的封裝呼叫

  • OKHttpUtil使用

    maven引入

    <dependency>
    <groupId>io.github.admin4j</groupId>
    <artifactId>http</artifactId>
    <version>0.4.0</version>
    </dependency>

    最新版查詢:

    https://search.maven.org/artifact/io.github.admin4j/http

    GET

    最簡單的使用莫過於用HttpUtil工具類快速請求某個介面:

    Response response = HttpUtil.get(https://github.com/search, Pair.of(qokhttp));
    System.out.println(response =  + response);

    POST

    一行程式碼即可搞定,當然Post請求也很簡單:

    # JSON 格式的body
    Response post = HttpUtil.post(https://oapi.dingtalk.com/robot/send?access_token=27f5954ab60ea8b2e431ae9101b1289c138e85aa6eb6e3940c35ee13ff8b6335{\msgtype\: \text\,\text\: {\content\:\【反饋提醒】我就是我, 是不一樣的煙火\}});
    System.out.println(post =  + post);
    # form 請求
    Map<String, Object> formParams = new HashMap<>(16);
    formParams.put(usernameadmin);
    formParams.put(passwordadmin123);
    Response response = HttpUtil.postForm(http://192.168.1.13:9100/auth/login,
    formParams
    );
    System.out.println(response =  + response);

    返回格式為JSON的 可以使用 HttpJsonUtil 自動返回JsonObject

    JSONObject object=HttpJsonUtil.get(https://github.com/search,
    Pair.of(q,http),
    Pair.of(username,agonie201218));
    System.out.println(object = +object);

    檔上傳

    File file=new File(C:\\Users\\andanyang\\Downloads\\Sql.txt);
    Map<String, Object> formParams=new HashMap<>();
    formParams.put(key,test);
    formParams.put(file,file);
    formParams.put(token,WXyUseb-D4sCum-EvTIDYL-mEehwDtrSBg-Zca7t:qgOcR2gUoKmxt-VnsNb657Oatzo=:eyJzY29wZSI6InpoYW56aGkiLCJkZWFkbGluZSI6MTY2NTMwNzUxNH0=);
    Response response=HttpUtil.upload(https://upload.qiniup.com/,formParams);
    System.out.println(response);

    下載檔

    HttpUtil.down(https://gitee.com/admin4j/common-http,path/);

    HttpRequest 鏈式請求

    # get
    Response response=HttpRequest.get(https://search.gitee.com/?skin=rec&type=repository)
    .queryMap(q,admin4j)
    .header(HttpHeaderKey.USER_AGENT,admin4j)
    .execute();
    System.out.println(response = +response);
    # post form
    Response response=HttpRequest.get(http://192.168.1.13:9100/auth/login)
    .queryMap(q,admin4j)
    .header(HttpHeaderKey.USER_AGENT,admin4j)
    .form(username,admin)
    .form(password,admin123)
    .execute();
    System.out.println(response = +response);

    post form 日誌

    16:49:14.092[main]DEBUG io.github.admin4j.http.core.HttpLogger- -->GET http://192.168.1.13:9100/auth/login?q=admin4j http/1.1
    16:49:14.094[main]DEBUG io.github.admin4j.http.core.HttpLogger-User-Agent:admin4j
    16:49:14.094[main]DEBUG io.github.admin4j.http.core.HttpLogger-Host:192.168.1.13:9100
    16:49:14.094[main]DEBUG io.github.admin4j.http.core.HttpLogger-Connection:Keep-Alive
    16:49:14.094[main]DEBUG io.github.admin4j.http.core.HttpLogger-Accept-Encoding:gzip
    16:49:14.094[main]DEBUG io.github.admin4j.http.core.HttpLogger- -->END GET
    16:49:14.670[main]DEBUG io.github.admin4j.http.core.HttpLogger-<--200OK http://192.168.1.13:9100/auth/login?q=admin4j (575ms)
    16:49:14.670[main]DEBUG io.github.admin4j.http.core.HttpLogger-transfer-encoding:chunked
    16:49:14.670[main]DEBUG io.github.admin4j.http.core.HttpLogger-Vary:Origin
    16:49:14.670[main]DEBUG io.github.admin4j.http.core.HttpLogger-Vary:Access-Control-Request-Method
    16:49:14.670[main]DEBUG io.github.admin4j.http.core.HttpLogger-Vary:Access-Control-Request-Headers
    16:49:14.670[main]DEBUG io.github.admin4j.http.core.HttpLogger-Vary:Origin
    16:49:14.670[main]DEBUG io.github.admin4j.http.core.HttpLogger-Vary:Access-Control-Request-Method
    16:49:14.670[main]DEBUG io.github.admin4j.http.core.HttpLogger-Vary:Access-Control-Request-Headers
    16:49:14.671[main]DEBUG io.github.admin4j.http.core.HttpLogger-Content-Type:application/json;charset=utf-8
    16:49:14.671[main]DEBUG io.github.admin4j.http.core.HttpLogger-Date:Tue,08Nov 2022 08:49:14GMT
    16:49:14.671[main]DEBUG io.github.admin4j.http.core.HttpLogger-
    16:49:14.671[main]DEBUG io.github.admin4j.http.core.HttpLogger-{code:406,msg:Full authentication is required to access this resource}
    16:49:14.671[main]DEBUG io.github.admin4j.http.core.HttpLogger-<--END HTTP(76-byte body)
    response=Response{protocol=http/1.1,code=200,message=OK,url=http://192.168.1.13:9100/auth/login?q=admin4j}

    在 Springboot 中使用

    maven引入

    <dependency>
    <groupId>io.github.admin4j</groupId>
    <artifactId>common-http-starter</artifactId>
    <version>0.4.0</version>
    </dependency>

    最新版查詢 io.github.admin4j:common-http-starter

    spring 版可以對 OkHttp進行個人化配置

    配置詳見

    public classHttpConfig{
    /**
    * 日誌等級
    */

    private HttpLoggingInterceptor.Level loggLevel = HttpLoggingInterceptor.Level.BODY;
    /**
    * 讀取超時時間,秒
    */

    privatelong readTimeout = 30;
    /**
    * 連結超時時間
    */

    privatelong connectTimeout = 30;
    privateboolean followRedirects = false;
    /**
    * 最大的連線數
    */

    privateint maxIdleConnections = 5;
    /**
    * 最大的kepAlive 時間 秒
    */

    privatelong keepAliveDuration = 5;
    private String userAgent = OKHTTP;
    /**
    * 是否支持cookie
    */

    privateboolean cookie = false;
    private ProxyConfig proxy;

    @Data
    publicstatic classProxyConfig{
    private Proxy.Type type = Proxy.Type.HTTP;
    private String host;
    private Integer port = 80;
    private String userName;
    private String password;
    }
    }





    如何快速封裝外部介面

    以實體計畫為例,封裝 ebay介面

    public classEbayClientextendsApiJsonClient{
    /**
    * 店鋪配置
    *
    @param storeId
    */

    publicEbayClient(Long storeId){
    //TODO 獲取店鋪相關配置
    Map<String, String> config = new HashMap<>();
    basePath = https://api.ebay.com;
    defaultHeaderMap.put(AuthorizationBearer  + config.get(accessToken));
    defaultHeaderMap.put(X-EBAY-C-MARKETPLACE-ID, config.get(marketplaceId));
    }
    }

    EbayClient 封裝ebay api請求 基礎類

    /**
     * ebay 庫存相關api
     * @author andanyang
     */

    public classEbayInventoryClientextendsEbayClient{
    /**
    * 店鋪配置
    *
    @param storeId
    */

    publicEbayInventoryClient(Long storeId){
    super(storeId);
    }
    /**
    * 庫存列表
    *
    @param limit
    @param offset
    @return
    @throws IOException
    */

    public JSONObject inventoryItem(Integer limit, Integer offset)throws IOException {
    Map<String, Object> queryMap = new HashMap(2);
    queryMap.put(limit, limit);
    queryMap.put(offset, offset);
    return get(/sell/inventory/v1/inventory_item, queryMap);
    }
    }

    EbayInventoryClient 封裝ebay 庫存 api請求

    使用

    EbayInventoryClient ebayInventoryClient=new EbayInventoryClient(1L);
    JSONObject jsonObject=ebayInventoryClient.inventoryItem(0,10);

    /**
     * 訂單相關api
     * @author andanyang
     */

    public classEbayOrderClientextendsEbayClient{

    /**
    * 店鋪配置
    *
    @param storeId
    */

    publicEbayOrderClient(Long storeId){
    super(storeId);
    }
    /**
    * 訂單列表
    *
    @param beginTime
    @param endTime
    @param limit
    @param offset
    @return
    */

    public JSONObject orders(String beginTime, String endTime, int limit, int offset){
    final String path = /sell/fulfillment/v1/order;
    String filter = MessageFormat.format(lastmodifieddate:[{0}..{1}], beginTime, endTime);
    //
    Map<String, Object> queryMap = new HashMap<>(8);
    queryMap.put(filter, filter);
    queryMap.put(limit, limit);
    queryMap.put(offset, offset);
    return get(/sell/inventory/v1/inventory_item, queryMap);
    }
    }




    庫存相關的使用 EbayInventoryClient ,訂單相關的使用 EbayOrderClient ,是不是很清晰

    源碼位置:

    https://github.com/admin4j/common-http

    來源:andyoung.blog.csdn.net/article/details/127755025

    >>

    END

    精品資料,超贊福利,免費領

    微信掃碼/長按辨識 添加【技術交流群

    群內每天分享精品學習資料

    最近開發整理了一個用於速刷面試題的小程式;其中收錄了上千道常見面試題及答案(包含基礎並行JVMMySQLRedisSpringSpringMVCSpringBootSpringCloud訊息佇列等多個型別),歡迎您的使用。

    👇👇

    👇點選"閱讀原文",獲取更多資料(持續更新中