zhouen 发表于 2025-6-14 10:15

JAVA OkHttp 网络请求链式封装

本帖最后由 zhouen 于 2025-6-16 11:30 编辑



###可通过链式快速进行网络请求;示例如下:


```java
package com.ssc.utils;

import okhttp3.*;

import java.util.HashMap;
import java.util.Map;

import java.io.IOException;
import java.util.concurrent.TimeUnit;

public class OkHttp {

    private final OkHttpClient client;

    // 单例
    private static final OkHttp instance = new OkHttp();

    public static OkHttp http() {
      return instance;
    }

    private OkHttp() {
      OkHttpClient.Builder builder = new OkHttpClient.Builder()
                .connectTimeout(20, TimeUnit.SECONDS)
                .readTimeout(300, TimeUnit.SECONDS)
                .writeTimeout(300, TimeUnit.SECONDS);


      // 公共请求头(可自定义)
      builder.addInterceptor(chain -> {
            Request original = chain.request();
            Request request = original.newBuilder()
                  .header("Accept", "application/json")
                  .header("Content-Type", "application/json")
                  .method(original.method(), original.body())
                  .build();
            return chain.proceed(request);
      });
      
      params = new HashMap<>();
      headersBuilder = new Headers.Builder();

      client = builder.build();
    }

    // 请求构建上下文
    private String url;
    private String jsonBody;
    private Map<String, String> params = new HashMap<>();
    private Headers.Builder headersBuilder = new Headers.Builder();
    private String method = "GET";
    private MediaType mediaType = MediaType.get("application/json; charset=utf-8");

    public OkHttp url(String url) {
      this.url = url;
      return this;
    }

    public OkHttp addParam(String key, String value) {
      params.put(key, value);
      return this;
    }

    public OkHttp addParam(Map<String, String> param) {
      params.putAll(param);
      return this;
    }

    public OkHttp addHeader(String key, String value) {
      headersBuilder.add(key, value);
      return this;
    }

    public OkHttp json(String jsonBody) {
      this.jsonBody = jsonBody;
      this.method = "POST";
      return this;
    }

    public OkHttp get() {
      this.method = "GET";
      return this;
    }

    public OkHttp post() {
      this.method = "POST";
      return this;
    }

    public OkHttp form() {
      this.mediaType = MediaType.get("application/x-www-form-urlencoded; charset=utf-8");
      FormBody.Builder formBuilder = new FormBody.Builder();
      for (Map.Entry<String, String> entry : params.entrySet()) {
            formBuilder.add(entry.getKey(), entry.getValue());
      }
      this.jsonBody = null;
      this.params.clear();
      return this;
    }

    public void execute(Callback callback) throws IOException {
      RequestBody body = null;

      if ("POST".equalsIgnoreCase(method)) {
            if (mediaType.equals(MediaType.get("application/x-www-form-urlencoded; charset=utf-8"))) {
                FormBody.Builder formBuilder = new FormBody.Builder();
                for (Map.Entry<String, String> entry : params.entrySet()) {
                  formBuilder.add(entry.getKey(), entry.getValue());
                }
                body = formBuilder.build();
            } else if (jsonBody != null && !jsonBody.isEmpty()) {
                body = RequestBody.create(jsonBody, mediaType);
            } else {
                body = RequestBody.create("", mediaType);
            }
      }
      else if ("GET".equalsIgnoreCase(method)) {
            HttpUrl.Builder builder = Objects.requireNonNull(HttpUrl.parse(url)).newBuilder();
            for (Map.Entry<String, String> entry : params.entrySet()) {
                builder.addQueryParameter(entry.getKey(), entry.getValue());
            }
            url = builder.build().toString();
      }

      Request request = new Request.Builder()
                .url(url)
                .method(method, body)
                .headers(headersBuilder.build())
                .build();

      client.newCall(request).enqueue(callback);
    }

    public Response execute() throws IOException {
      RequestBody body = null;

      if ("POST".equalsIgnoreCase(method)) {
            if (mediaType.equals(MediaType.get("application/x-www-form-urlencoded; charset=utf-8"))) {
                FormBody.Builder formBuilder = new FormBody.Builder();
                for (Map.Entry<String, String> entry : params.entrySet()) {
                  formBuilder.add(entry.getKey(), entry.getValue());
                }
                body = formBuilder.build();
            } else if (jsonBody != null && !jsonBody.isEmpty()) {
                body = RequestBody.create(jsonBody, mediaType);
            } else {
                body = RequestBody.create("", mediaType);
            }
      }

      Request request = new Request.Builder()
                .url(url)
                .method(method, body)
                .headers(headersBuilder.build())
                .build();

      return client.newCall(request).execute();
    }


    public static void main(String[] args) {
      try {
            //同步 GET 请求:
            Response response = OkHttp.http()
                  .url("https://api.example.com/data")
                  .get()
                  .execute();

            if (response.isSuccessful() && response.body() != null) {
                System.out.println(response.body().string());
            }

            //异步 POST JSON 请求
            OkHttp.http()
                  .url("https://api.example.com/login")
                  .post()
                  .json("{\"username\":\"admin\",\"password\":\"123456\"}")
                  .execute(new Callback() {
                        @Override
                        public void onFailure(Call call, IOException e) {
                            System.err.println("请求失败: " + e.getMessage());
                        }

                        @Override
                        public void onResponse(Call call, Response response) throws IOException {
                            if (response.isSuccessful() && response.body() != null) {
                              System.out.println("登录成功: " + response.body().string());
                            } else {
                              System.err.println("服务器返回错误: " + response.code());
                            }
                        }
                  });

            //同步post
            Response response1 = OkHttp.http()
                  .url("https://api.example.com/login")
                  .post()
                  .json("{\"username\":\"admin\",\"password\":\"123456\"}")
                  .execute(); // 同步执行

            if (response1.isSuccessful() && response1.body() != null) {
                System.out.println("响应结果: " + response1.body().string());
            } else {
                System.err.println("请求失败,状态码: " + response1.code());
            }
      } catch (IOException e) {
            e.printStackTrace();
      }
    }
}

```

laoser 发表于 2025-6-14 14:17

okhttp + retrofit

yibaoshutiao 发表于 2025-6-14 14:29

有点像Jsoup.connect

zhouen 发表于 2025-6-14 14:57

laoser 发表于 2025-6-14 14:17
okhttp + retrofit

仅Java后端网络请求用的简单封装;
安卓开发的话,搭配retrofit使用最佳

yaojunhua 发表于 2025-6-14 15:08

学习学习不错~
页: [1]
查看完整版本: JAVA OkHttp 网络请求链式封装