Java通过URLConnection发送HTTP请求的详细教程

5星 · 超过95%的资源 1 下载量 165 浏览量 更新于2024-09-01 收藏 95KB PDF 举报
"这篇文章主要介绍了Java利用java.net.URLConnection发送HTTP请求的方法,包括发送简单GET和POST请求的步骤,并提供了一个名为HttpRequestor的类作为示例。" 在Java开发中,我们经常需要发送HTTP请求来获取或提交数据。Java的标准库提供了`java.net.URL`和`java.net.URLConnection`类,它们可以用来实现这个功能。这两个类允许我们模拟浏览器行为,向服务器发送HTTP请求并接收响应。 一、发送HTTP请求的基础 1. 创建URL对象:首先,我们需要创建一个`java.net.URL`对象,它代表了我们要访问的网络资源的地址。例如: ```java URL url = new URL("http://example.com"); ``` 2. 建立URLConnection:接着,我们通过URL对象获取`URLConnection`实例,它是实际连接服务器的桥梁: ```java URLConnection connection = url.openConnection(); ``` 3. 配置连接:`URLConnection`提供了设置请求头、超时等选项的方法。例如,设置HTTP方法(GET或POST),添加请求头: ```java HttpURLConnection httpURLConnection = (HttpURLConnection) connection; httpURLConnection.setRequestMethod("POST"); httpURLConnection.setRequestProperty("Content-Type", "application/json; charset=UTF-8"); ``` 4. 发送请求:对于POST请求,我们需要写入请求体数据,然后调用`connect()`方法建立连接: ```java OutputStream outputStream = httpURLConnection.getOutputStream(); outputStream.write(jsonData.getBytes(charset)); outputStream.flush(); outputStream.close(); httpURLConnection.connect(); ``` 5. 接收响应:获取服务器的响应码,然后通过`InputStream`读取响应内容: ```java int responseCode = httpURLConnection.getResponseCode(); if (responseCode == HttpURLConnection.HTTP_OK) { InputStream in = httpURLConnection.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(in, charset)); String line; StringBuilder response = new StringBuilder(); while ((line = reader.readLine()) != null) { response.append(line); } reader.close(); } ``` 6. 关闭连接:最后,确保关闭所有打开的流以释放系统资源: ```java httpURLConnection.disconnect(); ``` 二、HttpRequestor类 文章中提到的`HttpRequestor`类是一个简化HTTP请求的工具类,它封装了上述步骤。该类可能包含以下方法: - `sendGetRequest(URL url)`: 发送GET请求的方法。 - `sendPostRequest(URL url, String requestBody)`: 发送POST请求的方法,其中`requestBody`是POST的数据。 - 这些方法内部会处理连接、设置请求头、发送请求、读取响应以及关闭连接的过程。 `HttpRequestor`类使用`Proxy`类可能支持代理服务器的配置,`OutputStreamWriter`用于写入POST请求的数据,而`BufferedReader`和`InputStreamReader`则用于读取响应内容。 `java.net.URLConnection`提供了一种基础但灵活的方式来发送HTTP请求,虽然相比一些专门的HTTP客户端库(如Apache HttpClient或OkHttp)可能略显繁琐,但在某些情况下,使用标准库可能更符合项目需求或保持代码简洁。
1315 浏览量
package test; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.util.List; import java.util.Map; public class HttpTest { private HttpURLConnection hc = null; private static final String oneUrlString = "http://xxx.jsp"; private static final String twoUrlString = "http://xxx.action"; public String getSessionId() { String sessionId = ""; try { URL url = new URL(oneUrlString); hc = (HttpURLConnection) url.openConnection();//默认的用GET提交 hc.setDoOutput(true); hc.connect(); Map map = hc.getHeaderFields(); //得到Cookie的所有内容,包括SESSIONID,在进行下次提交的时候 直接把这个Cookie的值设到头里头就行了 //淡然只得到SESSIONID也很简单的 ,但是有时候Set-Cookie的值有几个的 List list = (List) map.get("Set-Cookie"); if(list.size() == 0||list == null) { return null; } StringBuilder builder = new StringBuilder(); for(String str : list) { sessionId = builder.append(str).toString(); } hc.disconnect(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return sessionId; } public String getResponseContext(String parameters) { String responseContext = ""; try { URL url = new URL(twoUrlString); hc = (HttpURLConnection) url.openConnection();//使用POST提交 hc.addRequestProperty("Cookie", getSessionId()); hc.setDoOutput(true); hc.connect(); OutputStream out = hc.getOutputStream(); //参数是a=""&b=""这样拼接的一个串 out.flush(); out.close(); out.write(parameters.getBytes(),0,parameters.getBytes().length); InputStream in = hc.getInputStream(); InputStreamReader reader = new InputStreamReader(in,"gb2312"); BufferedReader read = new BufferedReader(reader); StringBuilder builder = new StringBuilder(); String str = ""; while((str = read.readLine()) != null) { builder = builder.append(str); } read.close(); reader.close(); in.close(); hc.disconnect(); responseContext = builder.toString(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return responseContext; } }