这里经常会问到java.net.URLConnection的使用,Oracle教程对此过于简洁。

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

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


当前回答

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()));

其他回答

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()));

如果您使用的是HTTP GET,请删除此行:

urlConnection.setDoOutput(true);

使现代化

新的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;
}

最初,我被这篇有利于HttpClient的文章误导了。

后来,我意识到HttpURLConnection将继续留在本文中。

根据谷歌博客:

Apache HTTP客户端在Eclair和Froyo上的bug更少。这是这些版本的最佳选择。对于姜饼,HttpURLConnection是最佳选择。其简单的API和小巧的尺寸使其非常适合Android。透明压缩和响应缓存减少了网络使用,提高了速度并节省了电池。新应用程序应使用HttpURLConnection;这是我们今后将花费精力的地方。

在阅读了这篇文章和一些其他堆栈流问题之后,我确信HttpURLConnection将持续更长的时间。

支持HttpURLConnection的一些SE问题:

在Android上,使用URL编码表单数据进行POST请求,而不使用UrlEncodedFormEntity

HttpPost适用于Java项目,但不适用于Android

在使用HTTP时,引用HttpURLConnection而不是基类URLConnection几乎总是更有用(因为URLConnection是一个抽象类,当您在HTTP URL上请求URLConnection.openConnection()时,无论如何都会返回)。

然后,您可以不依赖URLConnection#setDoOutput(true)将请求方法隐式设置为POST,而是使用httpURLConnection.setRequestMethod(“POST”),有些人可能会觉得这更自然(这也允许您指定其他请求方法,如PUT、DELETE…)。

它还提供了有用的HTTP常量,因此您可以执行以下操作:

int responseCode = httpURLConnection.getResponseCode();

if (responseCode == HttpURLConnection.HTTP_OK) {