在 Java 开发中,HttpURLConnection
是一个用于发送 HTTP 请求和接收 HTTP 响应的类。它提供了一种简单而灵活的方式来与 Web 服务器进行通信。下面将详细介绍如何在 Java 中使用HttpURLConnection
。
一、创建 HttpURLConnection 对象
要使用HttpURLConnection
,首先需要创建一个URL
对象,然后通过URL
对象的openConnection()
方法获取一个HttpURLConnection
对象。以下是创建HttpURLConnection
对象的代码示例:
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;
public class HttpURLConnectionExample {
public static void main(String[] args) {
try {
// 创建 URL 对象
URL url = new URL("http://www.example.com");
// 通过 URL 对象获取 HttpURLConnection 对象
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
// 设置请求方法,默认为 GET
connection.setRequestMethod("GET");
// 设置连接超时时间(单位:毫秒)
connection.setConnectTimeout(5000);
// 设置读取超时时间(单位:毫秒)
connection.setReadTimeout(5000);
// 发送请求并获取响应码
int responseCode = connection.getResponseCode();
System.out.println("Response Code: " + responseCode);
// 获取响应消息
String responseMessage = connection.getResponseMessage();
System.out.println("Response Message: " + responseMessage);
// 读取响应内容
// 可以根据需要选择合适的读取方式,如 InputStream、Reader 等
// 这里以读取 InputStream 为例
java.io.InputStream inputStream = connection.getInputStream();
java.util.Scanner scanner = new java.util.Scanner(inputStream).useDelimiter("\\A");
String response = scanner.hasNext()? scanner.next() : "";
System.out.println("Response Content: " + response);
// 关闭连接
connection.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
}
}
在上述代码中,首先创建了一个URL
对象,指定了要连接的 URL。然后通过openConnection()
方法获取HttpURLConnection
对象,并设置了请求方法为GET
,连接超时时间和读取超时时间。接下来,使用getResponseCode()
和getResponseMessage()
方法获取响应码和响应消息,并使用getInputStream()
方法获取响应内容的输入流。最后,读取输入流中的内容并打印出来,最后关闭连接。
二、设置请求参数和请求头
除了设置请求方法和超时时间外,还可以设置请求参数和请求头。以下是设置请求参数和请求头的代码示例:
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.io.OutputStream;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Map;
import java.util.Set;
import java.util.HashMap;
public class HttpURLConnectionExample {
public static void main(String[] args) {
try {
// 创建 URL 对象
URL url = new URL("http://www.example.com");
// 通过 URL 对象获取 HttpURLConnection 对象
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
// 设置请求方法为 POST
connection.setRequestMethod("POST");
// 设置连接超时时间(单位:毫秒)
connection.setConnectTimeout(5000);
// 设置读取超时时间(单位:毫秒)
connection.setReadTimeout(5000);
// 设置请求参数
Map<String, String> params = new HashMap<>();
params.put("param1", "value1");
params.put("param2", "value2");
String queryString = buildQueryString(params);
byte[] postData = queryString.getBytes("UTF-8");
// 设置请求头
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
connection.setRequestProperty("Content-Length", String.valueOf(postData.length));
// 发送请求
connection.setDoOutput(true);
OutputStream outputStream = connection.getOutputStream();
outputStream.write(postData);
outputStream.flush();
// 获取响应码和响应消息
int responseCode = connection.getResponseCode();
System.out.println("Response Code: " + responseCode);
String responseMessage = connection.getResponseMessage();
System.out.println("Response Message: " + responseMessage);
// 读取响应内容
InputStream inputStream = connection.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
StringBuilder responseBuilder = new StringBuilder();
String line;
while ((line = reader.readLine())!= null) {
responseBuilder.append(line);
}
reader.close();
String response = responseBuilder.toString();
System.out.println("Response Content: " + response);
// 关闭连接
connection.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
}
private static String buildQueryString(Map<String, String> params) {
StringBuilder query = new StringBuilder();
boolean first = true;
for (Map.Entry<String, String> entry : params.entrySet()) {
if (first) {
first = false;
} else {
query.append("&");
}
query.append(entry.getKey()).append("=").append(entry.getValue());
}
return query.toString();
}
}
在上述代码中,首先创建了一个URL
对象和一个HttpURLConnection
对象,并设置了请求方法为POST
。然后创建了一个Map
对象用于存储请求参数,并使用buildQueryString()
方法将请求参数转换为查询字符串。接着设置了请求头的Content-Type
和Content-Length
属性。然后通过setDoOutput(true)
方法打开输出流,并将请求参数写入输出流中。最后获取响应码、响应消息和响应内容,并打印出来。
三、处理响应数据
获取到响应数据后,可以根据需要进行处理。通常情况下,响应数据可以是 JSON 格式、XML 格式或纯文本格式。以下是处理不同格式响应数据的示例代码:
- 处理 JSON 格式响应数据:
import org.json.JSONObject;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.BufferedReader;
public class HttpURLConnectionExample {
public static void main(String[] args) {
try {
// 创建 URL 对象
URL url = new URL("http://www.example.com");
// 通过 URL 对象获取 HttpURLConnection 对象
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
// 设置请求方法为 GET
connection.setRequestMethod("GET");
// 设置连接超时时间(单位:毫秒)
connection.setConnectTimeout(5000);
// 设置读取超时时间(单位:毫秒)
connection.setReadTimeout(5000);
// 发送请求并获取响应码
int responseCode = connection.getResponseCode();
System.out.println("Response Code: " + responseCode);
// 获取响应消息
String responseMessage = connection.getResponseMessage();
System.out.println("Response Message: " + responseMessage);
// 读取响应内容
InputStream inputStream = connection.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
StringBuilder responseBuilder = new StringBuilder();
String line;
while ((line = reader.readLine())!= null) {
responseBuilder.append(line);
}
reader.close();
String response = responseBuilder.toString();
System.out.println("Response Content: " + response);
// 处理 JSON 数据
JSonObject json = new JSonObject(response);
String name = json.getString("name");
int age = json.getInt("age");
System.out.println("Name: " + name);
System.out.println("Age: " + age);
// 关闭连接
connection.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
}
}
在上述代码中,首先创建了一个URL
对象和一个HttpURLConnection
对象,并设置了请求方法为GET
。然后发送请求并获取响应码、响应消息和响应内容。接着使用JSONObject
类将响应内容解析为 JSON 对象,并获取其中的name
和age
字段的值。最后关闭连接。
- 处理 XML 格式响应数据:
import javax.xml.parsers.documentBuilder;
import javax.xml.parsers.documentBuilderFactory;
import org.w3c.dom.document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.BufferedReader;
public class HttpURLConnectionExample {
public static void main(String[] args) {
try {
// 创建 URL 对象
URL url = new URL("http://www.example.com");
// 通过 URL 对象获取 HttpURLConnection 对象
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
// 设置请求方法为 GET
connection.setRequestMethod("GET");
// 设置连接超时时间(单位:毫秒)
connection.setConnectTimeout(5000);
// 设置读取超时时间(单位:毫秒)
connection.setReadTimeout(5000);
// 发送请求并获取响应码
int responseCode = connection.getResponseCode();
System.out.println("Response Code: " + responseCode);
// 获取响应消息
String responseMessage = connection.getResponseMessage();
System.out.println("Response Message: " + responseMessage);
// 读取响应内容
InputStream inputStream = connection.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
StringBuilder responseBuilder = new StringBuilder();
String line;
while ((line = reader.readLine())!= null) {
responseBuilder.append(line);
}
reader.close();
String response = responseBuilder.toString();
System.out.println("Response Content: " + response);
// 处理 XML 数据
documentBuilderFactory factory = documentBuilderFactory.newInstance();
documentBuilder builder = factory.newdocumentBuilder();
document document = builder.parse(new java.io.StringReader(response));
document.getdocumentElement().normalize();
NodeList nodeList = document.getElementsByTagName("person");
for (int i = 0; i < nodeList.getLength(); i++) {
Node node = nodeList.item(i);
if (node.getNodeType() == Node.ELEMENT_NODE) {
Element element = (Element) node;
String name = element.getElementsByTagName("name").item(0).getTextContent();
int age = Integer.parseInt(element.getElementsByTagName("age").item(0).getTextContent());
System.out.println("Name: " + name);
System.out.println("Age: " + age);
}
}
// 关闭连接
connection.disconnect();
} catch (Exception e) {
e.printStackTrace();
}
}
}
在上述代码中,首先创建了一个URL
对象和一个HttpURLConnection
对象,并设置了请求方法为GET
。然后发送请求并获取响应码、响应消息和响应内容。接着使用documentBuilderFactory
和documentBuilder
解析响应内容为XML
文档,并获取person
元素的子元素name
和age
的值。最后关闭连接。
- 处理纯文本格式响应数据:
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.BufferedReader;
public class HttpURLConnectionExample {
public static void main(String[] args) {
try {
// 创建 URL 对象
URL url = new URL("http://www.example.com");
// 通过 URL 对象获取 HttpURLConnection 对象
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
// 设置请求方法为 GET
connection.setRequestMethod("GET");
// 设置连接超时时间(单位:毫秒)
connection.setConnectTimeout(5000);
// 设置读取超时时间(单位:毫秒)
connection.setReadTimeout(5000);
// 发送请求并获取响应码
int responseCode = connection.getResponseCode();
System.out.println("Response Code: " + responseCode);
// 获取响应消息
String responseMessage = connection.getResponseMessage();
System.out.println("Response Message: " + responseMessage);
// 读取响应内容
InputStream inputStream = connection.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
StringBuilder responseBuilder = new StringBuilder();
String line;
while ((line = reader.readLine())!= null) {
responseBuilder.append(line);
}
reader.close();
String response = responseBuilder.toString();
System.out.println("Response Content: " + response);
// 处理纯文本数据
System.out.println("Response Content (Text): " + response);
// 关闭连接
connection.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
}
}
在上述代码中,首先创建了一个URL
对象和一个HttpURLConnection
对象,并设置了请求方法为GET
。然后发送请求并获取响应码、响应消息和响应内容。接着直接打印响应内容作为纯文本数据。最后关闭连接。
总之,HttpURLConnection
是 Java 中用于发送 HTTP 请求和接收 HTTP 响应的类。通过创建HttpURLConnection
对象、设置请求参数和请求头、发送请求和处理响应数据,可以方便地与 Web 服务器进行通信。在实际应用中,可以根据需要选择合适的方式来处理不同格式的响应数据。