这里经常会问到java.net.URLConnection的使用,Oracle教程对此过于简洁。
该教程基本上只展示了如何发出GET请求并读取响应。它没有解释如何使用它来执行POST请求、设置请求头、读取响应头、处理cookie、提交HTML表单、上传文件等。
那么,我如何使用java.net.URLConnection来激发和处理“高级”HTTP请求?
这里经常会问到java.net.URLConnection的使用,Oracle教程对此过于简洁。
该教程基本上只展示了如何发出GET请求并读取响应。它没有解释如何使用它来执行POST请求、设置请求头、读取响应头、处理cookie、提交HTML表单、上传文件等。
那么,我如何使用java.net.URLConnection来激发和处理“高级”HTTP请求?
当前回答
您还可以使用jcabi http(我是一名开发人员)的JdkRequest,它为您完成所有这些工作,装饰HttpURLConnection、激发http请求和解析响应,例如:
String html = new JdkRequest("http://www.google.com").fetch().body();
查看此日志以了解更多信息:http://www.yegor256.com/2014/04/11/jcabi-http-intro.html
其他回答
如果您使用的是Java 11(Android除外),而不是传统的HttpUrlConnection类,则可以使用Java 11新的HTTP客户端API。
GET请求示例:
var uri = URI.create("https://httpbin.org/get?age=26&isHappy=true");
var client = HttpClient.newHttpClient();
var request = HttpRequest
.newBuilder()
.uri(uri)
.header("accept", "application/json")
.GET()
.build();
var response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode());
System.out.println(response.body());
异步执行的同一请求:
var responseAsync = client
.sendAsync(request, HttpResponse.BodyHandlers.ofString())
.thenApply(HttpResponse::body)
.thenAccept(System.out::println);
// responseAsync.join(); // Wait for completion
POST请求示例:
var request = HttpRequest
.newBuilder()
.uri(uri)
.version(HttpClient.Version.HTTP_2)
.timeout(Duration.ofMinutes(1))
.header("Content-Type", "application/json")
.header("Authorization", "Bearer fake")
.POST(BodyPublishers.ofString("{ title: 'This is cool' }"))
.build();
var response = client.send(request, HttpResponse.BodyHandlers.ofString());
要以多部分(multipart/form-data)或url编码(application/x-www-form-urlencoded)格式发送表单数据,请参阅此解决方案。
有关HTTP客户端API的示例和更多信息,请参阅本文。
旁注
对于Java标准库HTTP服务器,请参阅本文。
我建议你看一下kevinsawicki/http请求的代码,它基本上是HttpUrlConnection之上的一个包装器,它提供了一个简单得多的API,以防你现在只想发出请求,或者你可以看一下源代码(不太大),看看连接是如何处理的。
示例:使用内容类型application/json和一些查询参数发出GET请求:
// GET http://google.com?q=baseball%20gloves&size=100
String response = HttpRequest.get("http://google.com", true, "q", "baseball gloves", "size", 100)
.accept("application/json")
.body();
System.out.println("Response was: " + response);
使现代化
新的HTTP客户端随Java 9一起提供,但作为孵化器模块名为jdk.incluator.httpclient。孵化器模块包括一种将非最终API交给开发人员的方法API在未来定稿或删除方面的进展释放
在Java 9中,您可以发送GET请求,如:
// GET
HttpResponse response = HttpRequest
.create(new URI("http://www.stackoverflow.com"))
.headers("Foo", "foovalue", "Bar", "barvalue")
.GET()
.response();
然后可以检查返回的HttpResponse:
int statusCode = response.statusCode();
String responseBody = response.body(HttpResponse.asString());
由于这个新的HTTP客户端位于java.httpclient-jdk.wirculator.httpclient模块中,您应该在module-info.java文件中声明这个依赖关系:
module com.foo.bar {
requires jdk.incubator.httpclient;
}
HTTP URL命中有两个选项:GET/POST
GET请求:
HttpURLConnection.setFollowRedirects(true); // Defaults to true
String url = "https://name_of_the_url";
URL request_url = new URL(url);
HttpURLConnection http_conn = (HttpURLConnection)request_url.openConnection();
http_conn.setConnectTimeout(100000);
http_conn.setReadTimeout(100000);
http_conn.setInstanceFollowRedirects(true);
System.out.println(String.valueOf(http_conn.getResponseCode()));
POST请求:
HttpURLConnection.setFollowRedirects(true); // Defaults to true
String url = "https://name_of_the_url"
URL request_url = new URL(url);
HttpURLConnection http_conn = (HttpURLConnection)request_url.openConnection();
http_conn.setConnectTimeout(100000);
http_conn.setReadTimeout(100000);
http_conn.setInstanceFollowRedirects(true);
http_conn.setDoOutput(true);
PrintWriter out = new PrintWriter(http_conn.getOutputStream());
if (urlparameter != null) {
out.println(urlparameter);
}
out.close();
out = null;
System.out.println(String.valueOf(http_conn.getResponseCode()));
受Stack Overflow的这些问题和其他问题的启发,我创建了一个最小的开源基本http客户端,它体现了这里找到的大多数技术。
googlehttpjava客户端也是一个很好的开源资源。