在这里,经常会被询问如何使用java.net.URLConnection
,而Oracle教程对此过于简略。
该教程基本上只展示了如何发送GET请求并读取响应。它没有解释如何使用它来执行POST请求、设置请求头部、读取响应头部、处理cookies、提交HTML表单、上传文件等。
那么,我如何使用java.net.URLConnection
来发送和处理“高级”HTTP请求呢?
在这里,经常会被询问如何使用java.net.URLConnection
,而Oracle教程对此过于简略。
该教程基本上只展示了如何发送GET请求并读取响应。它没有解释如何使用它来执行POST请求、设置请求头部、读取响应头部、处理cookies、提交HTML表单、上传文件等。
那么,我如何使用java.net.URLConnection
来发送和处理“高级”HTTP请求呢?
你也可以使用JdkRequest
,它来自于jcabi-http(我是开发者),它会为你完成所有的工作,包括装饰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 Client API。
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
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
) 格式,请参见 this solution。
有关 HTTP Client API 的示例和更多信息,请参见 this article。
如需 Java 标准库的 HTTP 服务器,请参见 this post。
HttpURLConnection
的Javadoc中已经有了答案。 - undefined