这里经常会问到java.net.URLConnection的使用,Oracle教程对此过于简洁。
该教程基本上只展示了如何发出GET请求并读取响应。它没有解释如何使用它来执行POST请求、设置请求头、读取响应头、处理cookie、提交HTML表单、上传文件等。
那么,我如何使用java.net.URLConnection来激发和处理“高级”HTTP请求?
这里经常会问到java.net.URLConnection的使用,Oracle教程对此过于简洁。
该教程基本上只展示了如何发出GET请求并读取响应。它没有解释如何使用它来执行POST请求、设置请求头、读取响应头、处理cookie、提交HTML表单、上传文件等。
那么,我如何使用java.net.URLConnection来激发和处理“高级”HTTP请求?
当前回答
还有OkHttp,它是一个默认高效的HTTP客户端:
HTTP/2支持允许对同一主机的所有请求共享一个套接字。连接池减少了请求延迟(如果HTTP/2不可用)。透明GZIP缩小了下载大小。响应缓存完全避免了重复请求的网络。
首先创建OkHttpClient的实例:
OkHttpClient client = new OkHttpClient();
然后,准备GET请求:
Request request = new Request.Builder()
.url(url)
.build();
最后,使用OkHttpClient发送准备好的请求:
Response response = client.newCall(request).execute();
有关详细信息,请参阅OkHttp的文档
其他回答
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);
最初,我被这篇有利于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) {
受Stack Overflow的这些问题和其他问题的启发,我创建了一个最小的开源基本http客户端,它体现了这里找到的大多数技术。
googlehttpjava客户端也是一个很好的开源资源。