本文讲解了如何使用 Java 发起 Http 请求,并给出了样例代码,HTTP 是一种用于在 Web 浏览器和 Web 服务器之间传输数据的协议,Java 可以通过三方工具类发起 HTTP 请求。
一、什么是 http 和 https
HTTP 是一种用于在 Web 浏览器和 Web 服务器之间传输数据的协议。
HTTP 是一个无状态、面向连接的协议,使用 TCP 作为传输协议,默认运行在 80 8080 端口上。HTTP 使用 请求-响应 模型,客户端发送 HTTP 请求到服务器,服务器根据请求返回相应的 HTTP 响应。
HTTPS 是一种加密的 HTTP 协议。它通过使用 SSL 或 TLS 协议来加密 HTTP 通信,以确保数据在传输过程中的安全性。
HTTPS 在 HTTP 之上加入了加密和身份验证的功能,使得数据在传输过程中更加安全可靠。
当客户端发起 HTTPS 请求时,服务器会返回一个公钥证书,客户端使用服务器的公钥加密通信。
在通信过程中,服务器使用私钥解密客户端发送的数据,客户端使用服务器的公钥加密发送的数据。
这样,即使有人截获了通信数据,也无法解密其中的内容,保护了数据的机密性和完整性。
HTTPS 常用于需要保护敏感信息传输的网站,如银行、电子商务和社交媒体等。
通过使用 HTTPS,可以有效防止窃听、篡改和伪装等网络攻击,提高了数据传输的安全性。
二、如何发起 http 请求
Java 可以使用 java.net.HttpURLConnection 或第三方库(如 Apache HttpClient、OkHttp 等)来发起 HTTP 请求,以下是一个使用 java.net.HttpURLConnection 发起 HTTP GET 请求的示例代码,请同学们复制到本地执行。
import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; public class HttpExample { public static void main(String[] args) { try { // 创建URL对象 URL url = new URL("http://api.example.com/data"); // 替换为实际的URL // 打开HTTP连接 HttpURLConnection connection = (HttpURLConnection) url.openConnection(); // 设置请求方法为GET connection.setRequestMethod("GET"); // 获取响应状态码 int responseCode = connection.getResponseCode(); System.out.println("Response Code: " + responseCode); // 读取响应内容 BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); String line; StringBuilder response = new StringBuilder(); while ((line = reader.readLine()) != null) { response.append(line); } reader.close(); // 打印响应内容 System.out.println("Response Body: " + response.toString()); // 关闭连接 connection.disconnect(); } catch (Exception e) { e.printStackTrace(); } } }
在这个示例中,我们首先创建 URL 对象,指定要请求的 URL。
然后,我们通过 url.openConnection() 打开 HTTP 连接,并将其强制转换为 HttpURLConnection 对象。
接着,我们可以设置请求方法(如 GET、POST 等),获取响应状态码,读取响应内容并进行相应的处理,最后我们关闭连接。
实际的HTTP请求可能需要处理更多的请求头、请求体、响应头等信息,使用第三方库可以提供更多的功能和便捷性。
三、如何发起 https 请求
Java 中可以使用 HttpsURLConnection 类发起 HTTPS 请求,以下是一个使用 HttpsURLConnection 发起 GET 请求的示例代码,请同学们复制到本地执行。
import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.URL; import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLContext; import javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager; import java.security.cert.X509Certificate; public class HttpsExample { public static void main(String[] args) { try { // 创建信任管理器 TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() { public void checkClientTrusted(X509Certificate[] certs, String authType) {} public void checkServerTrusted(X509Certificate[] certs, String authType) {} public X509Certificate[] getAcceptedIssuers() { return null; } }}; // 获取默认的SSL上下文 SSLContext sslContext = SSLContext.getInstance("TLS"); sslContext.init(null, trustAllCerts, new java.security.SecureRandom()); HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory()); // 创建URL对象 URL url = new URL("https://api.example.com/data"); // 替换为实际的URL // 打开HTTPS连接 HttpsURLConnection connection = (HttpsURLConnection) url.openConnection(); // 设置请求方法为GET connection.setRequestMethod("GET"); // 获取响应状态码 int responseCode = connection.getResponseCode(); System.out.println("Response Code: " + responseCode); // 读取响应内容 BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); String line; StringBuilder response = new StringBuilder(); while ((line = reader.readLine()) != null) { response.append(line); } reader.close(); // 打印响应内容 System.out.println("Response Body: " + response.toString()); // 关闭连接 connection.disconnect(); } catch (Exception e) { e.printStackTrace(); } } }
我们创建一个信任管理器,用于实现信任所有证书的操作。
然后,我们获取默认的 SSL 上下文,并将信任管理器应用于该 SSL 上下文。
接下来,我们创建 URL 对象,并使用 url.openConnection() 打开 HTTPS 连接,并将其强制转换为 HttpsURLConnection 对象。
然后,我们可以设置请求方法(如 GET、POST 等),获取响应状态码,读取响应内容并进行相应的处理,最后我们关闭连接。
这个示例代码中信任所有证书的操作并不安全,只适用于测试或开发环境,在生产环境中,建议同学们使用真实的证书和受信任的证书链进行验证。
四、http 请求的状态码和数据解析
Java中可以使用 HttpURLConnection 或第三方库来发起 HTTP 请求,并获取响应的状态码和数据。
首先,发起 HTTP 请求并获取响应的状态码可以使用以下代码,请同学们复制到本地执行。
import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; public class HttpExample { public static void main(String[] args) { try { // 创建URL对象 URL url = new URL("http://api.example.com/data"); // 打开HTTP连接 HttpURLConnection connection = (HttpURLConnection) url.openConnection(); // 设置请求方法为GET connection.setRequestMethod("GET"); // 获取响应状态码 int responseCode = connection.getResponseCode(); System.out.println("Response Code: " + responseCode); // 读取响应内容 BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); String line; StringBuilder response = new StringBuilder(); while ((line = reader.readLine()) != null) { response.append(line); } reader.close(); // 打印响应内容 System.out.println("Response Body: " + response.toString()); // 关闭连接 connection.disconnect(); } catch (Exception e) { e.printStackTrace(); } } }
以上代码通过创建URL对象,并使用 url.openConnection() 打开HTTP连接,然后设置请求方法为 GET。
接着,通过 connection.getResponseCode() 获取响应的状态码,通过 connection.getInputStream() 获取响应的输入流,并使用 BufferedReader 逐行读取响应内容,最后打印响应内容并关闭连接。
然后,关于数据解析,具体如何解析响应数据取决于数据的格式(如 JSON、XML、HTML 等)和使用的库。
常用的数据解析库有:JSONObject 和 JSONArray(处理JSON数据)、SAXParser和DOMParser(处理 XML 数据)、Jsoup(处理 HTML 数据),当然还有其他许多第三方库可供选择。
这里以使用 JSONObject 解析 JSON 数据为例,给同学们一个参考。
import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; public class JsonExample { public static void main(String[] args) { String jsonData = "{\"name\":\"John\",\"age\":30,\"city\":\"New York\"}"; try { JSONObject jsonObject = new JSONObject(jsonData); String name = jsonObject.getString("name"); int age = jsonObject.getInt("age"); String city = jsonObject.getString("city"); System.out.println("Name: " + name); System.out.println("Age: " + age); System.out.println("City: " + city); } catch (JSONException e) { e.printStackTrace(); } } }
以上代码将一个JSON字符串解析为 JSONObject,然后通过 getString(key) 和 getInt(key) 等方法获取对应字段的值。
五、http 请求面试题
- 请解释一下 Java 中的 HTTP 请求是如何工作的?
- 请介绍一下 Java 中常用的发送 HTTP 请求的类和库。
- 有哪些常见的 HTTP 请求方法?请给出它们的含义和用法。
- 如何在 Java 中发送一个 GET 请求?请给出示例代码。
- 如何在 Java 中发送一个 POST 请求?请给出示例代码。
- 如何处理 HTTP 请求的响应?如何获取响应的状态码和数据?
- 请解释一下 HTTP 的状态码,常见的状态码有哪些,它们分别代表什么意思?
- 在 Java 中如何处理 HTTP 请求的异常和错误?
- 如何设置 HTTP 请求的请求头(Headers)和请求参数(Parameters)?
- 在 Java 中如何处理 HTTP 请求的超时和重试?
六、总结
本文讲解了如何使用 Java 发起 Http 请求,并给出了样例代码,91 9191 篇 Java SE 入门教程已发布完毕。




