如何使用java.net.URLConnection发送和处理HTTP请求

2128

在这里,经常会被询问如何使用java.net.URLConnection,而Oracle教程对此过于简略。

该教程基本上只展示了如何发送GET请求并读取响应。它没有解释如何使用它来执行POST请求、设置请求头部、读取响应头部、处理cookies、提交HTML表单、上传文件等。

那么,我如何使用java.net.URLConnection来发送和处理“高级”HTTP请求呢?


2
一些投票数很高且标题通用的问题被标记为重复,并链接到此问题。此外,Java 中有新的方法来执行 HTTP 请求,传统的 URLConnection 方法可能会在未来被弃用。这个问题的标题应该改为 如何在 Java 中执行 HTTP 请求 - Mahozad
很多你的问题在HttpURLConnection的Javadoc中已经有了答案。 - undefined
没错。然而,有些人更喜欢具体的代码示例,因为他们并不总能将Javadoc中那些对他们来说晦涩难懂的措辞转化为正常运行的代码。这也是Stack Overflow存在的原因之一。 - undefined
12个回答

15

1
你怎么处理Cookies? - Dejell

4

如果您正在使用Java 11或更新版本(除了Android),而不是传统的HttpUrlConnection类,您可以使用Java 11新的HTTP Client 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) 格式,请参见 this solution

有关 HTTP Client API 的示例和更多信息,请参见 this article

侧记

如需 Java 标准库的 HTTP 服务器,请参见 this post


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接