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);
}
}
标签:调用,请求,JDK,url,Request,OkHttpClient,OkHttp,new,工具
From: https://blog.csdn.net/pig_Struggle/article/details/140438158