JDK调用工具(一)- HttpURLConnection+OkHttp

1. HttpURLConnection

HttpURLConnection 是 Java 提供的一个用于发送 HTTP 请求和接收 HTTP 响应的类。它位于 java.net 包中,用于建立与 HTTP 服务器的连接,并支持通过 GET、POST 等方法发送请求,并获取服务器的响应。使用示例如下:

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class JDKHttpUtil {
    private static final String EXAMPLE_URL = "http://www.example.com";
    public static void main(String[] args) throws Exception {
        // 1、获取HttpURLConnection
        URL url = new URL(EXAMPLE_URL);
        HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
        httpURLConnection.setRequestMethod("GET");

        // 2、设置请求内容
        httpURLConnection.setRequestProperty("Accept", "application/json");
        httpURLConnection.setRequestProperty("Accept-Charset", "utf-8");
        httpURLConnection.setInstanceFollowRedirects(true);
        httpURLConnection.setConnectTimeout(5000);
        httpURLConnection.setReadTimeout(10000);

        // 3、发送请求
        httpURLConnection.connect();

        // 4、处理结果
        int responseCode = httpURLConnection.getResponseCode();
        if (responseCode == 200) {
            // TODO 自定义序列化工具处理响应
            BufferedReader in = new BufferedReader(new InputStreamReader(httpURLConnection.getInputStream()));
            String inputLine;
            StringBuffer response = new StringBuffer();
            while ((inputLine = in.readLine()) != null) {
                response.append(inputLine).append("\r");
            }
            in.close();
            System.out.println("Response Body: " + response);
        }

        // 5、断开连接
        httpURLConnection.disconnect();
    }
}

使用注意事项:

①资源释放: 使用完毕后应调用 disconnect方法断开连接,释放资源。

②异常处理: 调用 openConnection(和操作连接时都可能抛出 IOException,应进行适当的异常处理。

③性能考虑: 对于大量的 HTTP 请求,考虑连接池或者复用 HttpURLConnection 实例以提升性能。

出于性能和请求定制考虑,直接使用HttpURLConnection的情况非常少见。常用OkHttp或者HttpClient替代。

2. OkHttp

OkHttp是一款高效的HTTP客户端,适用于Android和Java应用,是一款由Square公司贡献的开源的网络请求的轻量级框架。OkHttp提供了丰富的功能和灵活性,‌以满足各种复杂的网络请求需求。

①OkHttp 提供了现代化的、易于理解和使用的 API 设计。它使用 Builder 模式来构建请求和配置客户端,使得代码清晰、可读性强。

②OkHttp 支持 HTTP/2 和 SPDY,能够提升网络请求的效率和性能。

③OkHttp 自动管理连接池,减少了重复连接和请求的开销,提高了网络请求的效率。

④OkHttp 提供了拦截器机制,允许开发者在发送请求前和收到响应后执行自定义的逻辑,如添加公共参数、日志记录等。

⑤OkHttp 提供了丰富的配置选项,可以调整超时时间、缓存设置、重试策略等,以满足各种复杂的网络请求需求。

⑥开发者可以选择发送同步或异步的网络请求,灵活应对不同的需求场景。

⑦OkHttp 是开源的,社区活跃,可以通过扩展和定制来满足特定的需求,例如支持自定义的协议或认证方式。

OkHttp基本使用示例如下:

import okhttp3.*;
import org.jetbrains.annotations.NotNull;

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.concurrent.TimeUnit;

public class OKHttpExample {
    private static final String EXAMPLE_URL = "http://www.example.com";
    private static final String EXAMPLE_FILE_PATH = "http://www.example.com/1.jpg";
    public static void main(String[] args) throws Exception {
        // OkHttp使用建造者模式构建OkHttpClient、Request、ReqeuestBody
        // 1、GET请求
        OkHttpClient okHttpClient1 = new OkHttpClient();
        Request getRequest = new Request.Builder().url(EXAMPLE_URL).get().build();
        Call getCall = okHttpClient1.newCall(getRequest);
        Response getResponse = getCall.execute();
        if (getResponse.isSuccessful()){
            // TODO 自定义序列化工具处理响应
            BufferedReader in = new BufferedReader(new InputStreamReader(getResponse.body().byteStream()));
            String inputLine;
            StringBuffer response = new StringBuffer();
            while ((inputLine = in.readLine()) != null) {
                response.append(inputLine).append("\r");
            }
            in.close();
            System.out.println("Response Body: " + response);
        }

        // 2、POST请求
        OkHttpClient okHttpClient2 = new OkHttpClient();
        RequestBody body = new FormBody.Builder().add("name", "xuyuan").build();
        Request postRequest = new Request.Builder().url(EXAMPLE_URL).post(body).build();
        Call postCall = okHttpClient2.newCall(postRequest);
        Response postResponse = postCall.execute();
        //TODO .......

        //3、构建定制化配置的OkHttpClient对象,全局设置
        OkHttpClient okHttpClient3 = new OkHttpClient.Builder()
                .connectTimeout(5, TimeUnit.SECONDS)
                .readTimeout(10, TimeUnit.SECONDS)
                .writeTimeout(10, TimeUnit.SECONDS)
                .addInterceptor(chain -> {
                    Request req = chain.request();
                    String url = req.url().toString();
                    System.out.println("intercept: proceed start: url"+ url+ ", at "+System.currentTimeMillis());
                    Response rep = chain.proceed(req);
                    ResponseBody repBody = rep.body();
                    System.out.println("intercept: proceed end: url"+ url+ ", at "+System.currentTimeMillis());
                    return rep;
                })
                .build();

        //4、单次请求定制化配置
        Request request3 = new Request.Builder()
                .url("www.baidu.com")
                .post(null)
                .addHeader("key","value")
                .cacheControl(CacheControl.FORCE_CACHE)
                .build();


        // 5、异步请求发送
        Call call1 = okHttpClient3.newCall(request3);
        call1.enqueue(new Callback() {
            @Override
            public void onFailure(@NotNull Call call, @NotNull IOException e) {

            }

            @Override
            public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {

            }
        });

        // 6、取消请求,根据业务场景使用。取消的时候,很有可能已经发出了请求,取消也只是逻辑上的取消,物理上发送了请求
        call1.cancel();

        // 7、上传文件
        OkHttpClient okHttpClient4 = new OkHttpClient();
        MediaType contentType = MediaType.parse("application/json;charset=utf-8");
        RequestBody requestBody4 = RequestBody.create(contentType, "example");
        Request request4 = new Request.Builder().post(requestBody4).url(EXAMPLE_URL).build();
        Call call4 = okHttpClient4.newCall(request4);
        Response response4 = call4.execute();

        // 8、上传Multiparty 文件
        OkHttpClient okHttpClient5 = new OkHttpClient();
        MediaType contentType5 = MediaType.parse("text/x-markdown;charset=utf-8");
        RequestBody requestBody5 = new MultipartBody.Builder()
                .setType(MultipartBody.FORM)
                .addFormDataPart("title", "example")
                .addFormDataPart("image", "1.jpg", RequestBody.create(contentType5, new File(EXAMPLE_FILE_PATH)))
                .build();
        Request request = new Request.Builder().url(EXAMPLE_URL).post(requestBody5).build();
        Call call = okHttpClient5.newCall(request);

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小胖子许愿

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

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

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

打赏作者

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

抵扣说明:

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

余额充值