java使用okhttp请求

需要的包
        <dependency>
			<groupId>com.squareup.okhttp3</groupId>
			<artifactId>okhttp</artifactId>
			<version>4.9.1</version>
		</dependency>

 private static final OkHttpClient OKHTTP_CLIENT = new OkHttpClient.Builder()
            .connectTimeout(120, TimeUnit.SECONDS)
            .readTimeout(120,TimeUnit.SECONDS)
            .writeTimeout(120,TimeUnit.SECONDS)
            .build();

    private static final MediaType MEDIA_TYPE = MediaType.get("application/json; charset=utf-8");
    /**
     * OKHTTP  POST 同步请求
     * @param reqUrl  地址
     * @param headers 头部信息
     * @param params 请求参数
     * @return
     */
    public static String okHttpPost(String reqUrl , Map<String,String> headers, Map<String,String> params){
        RequestBody body = RequestBody.create(MEDIA_TYPE, JSONObject.toJSONString(params));
        // 发送请求
        Request request =getReqBuilder(reqUrl,headers).post(body).build();
        try{
            Response response = OKHTTP_CLIENT.newCall(request).execute();
            return response.body().string();
        }catch (Exception e){
            throw  new RuntimeException("HTTP POST同步请求失败 URL:"+reqUrl,e);
        }
    }

    /**
     * OKHTTP GET 同步 请求
     * @param url 地址
     * @param params 参数
     * @return
     */
    public static String okHttpGet(String url, Map<String,String> headers, Map<String,String> params){
        url = getParasmHandle(url,params);
        // 发送请求
        Request request = getReqBuilder(url, headers).build();
        try{
            Response response = OKHTTP_CLIENT.newCall(request).execute();
            return response.body().string();
        }catch (Exception e){
            log.error(e.getMessage(),e);
            return null;
        }
    }


    /**
     * OKHTTP GET 异步 请求
     * @param url 地址
     * @param params 参数
     * @return
     */
    public static void okHttpGetAsyn(String url, Map<String,String> headers, Map<String,String> params,Callback callback){
        url = getParasmHandle(url,params);
        // 发送请求
        Request request = getReqBuilder(url, headers).build();
        try{
            OKHTTP_CLIENT.newCall(request).enqueue(callback);
        }catch (Exception e){
            throw  new RuntimeException("HTTP GET异步请求失败 URL:"+url,e);
        }
    }

    /**
     * OKHTTP  POST 异步请求
     * @param reqUrl  地址
     * @param headers 头部信息
     * @param params 请求参数
     * @return
     */
    public static void okHttpPostAsyn(String reqUrl , Map<String,String> headers, Map<String,String> params,Callback callback){
        RequestBody body = RequestBody.create(MEDIA_TYPE, JSONObject.toJSONString(params));
        // 发送请求
        Request request = getReqBuilder(reqUrl, headers).post(body).build();
        try{
            OKHTTP_CLIENT.newCall(request).enqueue(callback);
        }catch (Exception e){
            throw  new RuntimeException("HTTP POST异步请求失败 URL:"+reqUrl,e);
        }
    }

    /**
     * 初始化 请求
     * @param url
     * @param headers
     * @return
     */
    private static Request.Builder getReqBuilder(String url, Map<String, String> headers){
        Request.Builder builder = new Request.Builder();
        builder.header("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36");
        if(headers!=null && !headers.isEmpty()) {
            headers.forEach(builder::addHeader);
        }
        builder.url(url);
        return builder;
    }

    /**
     * GET 请求参数处理
     * @param url
     * @param params
     * @return
     */
    private static String getParasmHandle(String url,Map<String,String> params){
        StringBuilder stringBuilder = new StringBuilder();
        if(params!=null && !params.isEmpty()) {
            params.keySet().forEach(res -> {
                if (StringUtils.isNotBlank(stringBuilder) || url.contains("?")) {
                    stringBuilder.append("&");
                } else {
                    stringBuilder.append("?");
                }
                try {
                    stringBuilder.append(String.format("%s=%s", res, URLEncoder.encode(params.get(res), "UTF-8")));
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }

            });
        }
        return url + stringBuilder;
    }
### 如何使用 Java 中的 OkHttp 库发送 GET 请求 以下是基于 OkHttp 客户端库实现 GET 请求的一个完整示例。此方法展示了如何构建 URL 参数并执行同步和异步请求。 #### 同步 GET 请求示例 ```java import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; public class OkHttpGetExample { public static void main(String[] args) throws Exception { OkHttpClient client = new OkHttpClient(); String url = "https://api.example.com/data?param1=value1&param2=value2"; Request request = new Request.Builder() .url(url) .build(); try (Response response = client.newCall(request).execute()) { if (!response.isSuccessful()) throw new IOException("Unexpected code " + response); System.out.println(response.body().string()); } } } ``` 上述代码片段展示了一个基本的同步 GET 请求过程[^2]。`Request.Builder()` 方法用于创建 HTTP 请求对象,而 `client.newCall(request).execute()` 则负责发起实际的网络调用。 --- #### 异步 GET 请求示例 对于需要非阻塞操作的应用场景,可以采用异步方式: ```java import okhttp3.Call; import okhttp3.Callback; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; import java.io.IOException; public class AsyncOkHttpGetExample { public static void main(String[] args) { OkHttpClient client = new OkHttpClient(); String url = "https://api.example.com/data?param1=value1&param2=value2"; Request request = new Request.Builder() .url(url) .build(); Call call = client.newCall(request); call.enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { e.printStackTrace(); } @Override public void onResponse(Call call, Response response) throws IOException { if (response.isSuccessful()) { System.out.println(response.body().string()); } else { System.out.println("Request failed: " + response.code()); } } }); } } ``` 这段代码实现了异步 GET 请求的功能。通过回调机制 (`Callback`) 处理响应数据或错误情况,从而避免主线程被阻塞。 --- #### 构建带参数的 URL 如果需要动态拼接查询字符串,则可以通过以下方式完成: ```java import java.net.URLEncoder; import java.nio.charset.StandardCharsets; public class UrlBuilder { public static String buildUrlWithParams(String baseUrl, String paramKey1, String paramValue1, String paramKey2, String paramValue2) throws Exception { StringBuilder sb = new StringBuilder(baseUrl); sb.append("?").append(URLEncoder.encode(paramKey1, StandardCharsets.UTF_8.toString())) .append("=").append(URLEncoder.encode(paramValue1, StandardCharsets.UTF_8.toString())); sb.append("&").append(URLEncoder.encode(paramKey2, StandardCharsets.UTF_8.toString())) .append("=").append(URLEncoder.encode(paramValue2, StandardCharsets.UTF_8.toString())); return sb.toString(); } } ``` 该函数利用 `URLEncoder.encode` 对特殊字符进行编码处理,确保生成合法的 URL[^3]。 --- ### 总结 以上介绍了两种常见的 GET 请求模式——同步与异步,并提供了动态构造 URL 的实用技巧。这些功能均依托于强大的 OkHttp 工具包,能够满足大多数开发者在网络交互中的需求[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安颜丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值