第一部分:HTTP协议基础

理解HTTP协议是网络编程的基石,掌握请求-响应模型、方法、状态码和报文结构

学习目标

掌握HTTP协议基本概念,理解请求/响应结构,熟悉常用HTTP方法和状态码

HTTP请求-响应模型

HTTP协议基于客户端-服务器模型,采用请求-响应工作方式:

客户端发送请求

浏览器或Java程序发送HTTP请求

服务器处理请求

Web服务器接收并处理请求

服务器返回响应

服务器将处理结果封装成HTTP响应

客户端处理响应

客户端接收并处理响应内容

HTTP请求方法

HTTP定义了一组请求方法,表示对资源的操作:

  • GET 获取资源(最常用)
  • POST 提交数据创建资源
  • PUT 更新已有资源
  • DELETE 删除资源
  • HEAD 获取响应头信息
  • OPTIONS 查询服务器支持的方法

HTTP状态码

状态码表示请求的处理结果:

  • 1xx 信息响应(继续处理)
  • 2xx 成功响应(200 OK)
  • 3xx 重定向(301 Moved Permanently)
  • 4xx 客户端错误(404 Not Found)
  • 5xx 服务器错误(500 Internal Server Error)

HTTP头部字段

HTTP头部传递请求和响应的元数据:

头部字段 说明 示例
Host 请求的目标主机 Host: www.example.com
User-Agent 客户端信息 User-Agent: Java/17
Content-Type 请求/响应体的MIME类型 Content-Type: application/json
Content-Length 请求/响应体的长度 Content-Length: 348
Location 重定向目标URL Location: /new-page

第二部分:Java URL类详解

Java的URL类提供了统一资源定位符的高级抽象,便于访问网络资源

学习目标

掌握URL类的使用,能够创建URL对象,解析URL各部分,使用URLConnection访问资源

URL结构解析

URL(Uniform Resource Locator)统一资源定位符的标准格式:

https:// www.example.com: 8080 /path/to/resource? param1=value1&param2=value2 #section1
URL部分 说明 Java获取方法
协议(Scheme) 访问资源使用的协议 (http, https, ftp等) url.getProtocol()
主机名(Host) 资源所在的主机域名或IP地址 url.getHost()
端口(Port) 访问端口(默认端口可省略) url.getPort()
路径(Path) 资源在服务器上的路径 url.getPath()
查询参数(Query) 传递给资源的参数(键值对) url.getQuery()
锚点(Fragment) 页面内的锚点位置(不会发送到服务器) url.getRef()

创建URL对象

Java中创建URL对象的几种方式:

// 1. 使用完整URL字符串 URL url1 = new URL("https://www.example.com:8080/api/data?category=books"); // 2. 分别指定协议、主机和文件 URL url2 = new URL("https", "www.example.com", "/api/users"); // 3. 指定协议、主机、端口和文件 URL url3 = new URL("https", "www.example.com", 8080, "/api/products"); // 4. 基于上下文创建URL URL baseUrl = new URL("https://api.example.com/v1/"); URL relativeUrl = new URL(baseUrl, "users/123");

处理MalformedURLException

创建URL对象时可能抛出的异常:

try { URL url = new URL("htp://example.com"); // 无效协议 } catch (MalformedURLException e) { System.err.println("URL格式错误: " + e.getMessage()); // 处理无效URL的情况 }

常见错误原因:
- 协议名称拼写错误
- 缺少冒号斜杠(://)
- 无效的端口号
- 包含非法字符

第三部分:URL实战编程

使用URL和URLConnection类访问网络资源

学习目标

掌握使用URLConnection读取网络资源,处理响应头,处理超时和异常

使用URLConnection读取内容

基本步骤:创建URL对象 -> 打开连接 -> 设置参数 -> 读取数据

import java.io.*; import java.net.*; public class URLReader { public static void main(String[] args) { try { // 1. 创建URL对象 URL url = new URL("https://jsonplaceholder.typicode.com/posts/1"); // 2. 打开连接 HttpURLConnection connection = (HttpURLConnection) url.openConnection(); // 3. 设置请求方法 connection.setRequestMethod("GET"); // 4. 设置超时时间(单位:毫秒) connection.setConnectTimeout(5000); connection.setReadTimeout(5000); // 5. 添加请求头 connection.setRequestProperty("User-Agent", "Java/17 URLConnection"); connection.setRequestProperty("Accept", "application/json"); // 6. 获取响应状态码 int responseCode = connection.getResponseCode(); System.out.println("响应状态码: " + responseCode); // 7. 读取响应内容 if (responseCode == HttpURLConnection.HTTP_OK) { try (BufferedReader reader = new BufferedReader( new InputStreamReader(connection.getInputStream()))) { String line; StringBuilder response = new StringBuilder(); while ((line = reader.readLine()) != null) { response.append(line); } System.out.println("响应内容:"); System.out.println(response.toString()); } } else { System.out.println("请求失败: " + responseCode); } // 8. 断开连接 connection.disconnect(); } catch (MalformedURLException e) { System.err.println("URL格式错误: " + e.getMessage()); } catch (IOException e) { System.err.println("IO错误: " + e.getMessage()); } } }

读取响应头信息

获取并遍历响应头信息:

// 获取所有响应头字段 Map> headers = connection.getHeaderFields(); // 遍历并打印所有响应头 System.out.println("响应头信息:"); for (Map.Entry> entry : headers.entrySet()) { String key = entry.getKey(); for (String value : entry.getValue()) { if (key != null) { System.out.println(key + ": " + value); } else { // 状态行(HTTP/1.1 200 OK) System.out.println("Status Line: " + value); } } } // 获取特定头信息 String contentType = connection.getHeaderField("Content-Type"); String contentLength = connection.getHeaderField("Content-Length"); System.out.println("Content-Type: " + contentType); System.out.println("Content-Length: " + contentLength);

处理重定向

自动处理HTTP重定向:

// 设置自动重定向(默认true) connection.setInstanceFollowRedirects(true); // 手动处理重定向 int status = connection.getResponseCode(); if (status == HttpURLConnection.HTTP_MOVED_PERM || status == HttpURLConnection.HTTP_MOVED_TEMP) { // 获取重定向URL String newUrl = connection.getHeaderField("Location"); URL redirectedUrl = new URL(newUrl); // 重新打开连接 connection = (HttpURLConnection) redirectedUrl.openConnection(); }

注意:
1. 默认情况下HttpURLConnection会自动处理重定向
2. 对于POST请求的重定向需要特殊处理
3. 无限重定向可能导致程序陷入循环

第四部分:常见错误与调试

解决URL编程中的常见问题和调试技巧

学习目标

识别并解决常见网络编程错误,掌握调试技巧

常见错误与解决方案

错误类型 原因 解决方案
UnknownHostException 域名无法解析 检查域名拼写,网络连接,DNS设置
ConnectException 无法建立连接 检查目标服务是否运行,防火墙设置,端口是否正确
SocketTimeoutException 连接或读取超时 增加超时时间,检查网络状况,优化服务响应
FileNotFoundException 资源不存在(HTTP 404) 检查URL路径是否正确,资源是否被移除
SSLHandshakeException HTTPS证书问题 更新证书,添加信任,或使用HTTP

调试技巧

  • 启用详细日志: 使用System.setProperty("javax.net.debug", "all")
  • 检查网络连接: 使用ping和telnet测试连通性
  • 分析HTTP流量: 使用Wireshark或Fiddler抓包分析
  • 打印完整URL: System.out.println(url.toExternalForm())
  • 使用代理: 设置代理查看请求详情
    // 设置HTTP代理 System.setProperty("http.proxyHost", "proxy.example.com"); System.setProperty("http.proxyPort", "8080");

安全注意事项

重要安全提示

  • 避免在URL中传递敏感数据,使用POST请求替代
  • 验证重定向URL,防止开放重定向漏洞
  • 处理HTTPS连接时,验证服务器证书的有效性
  • 限制从不受信任来源获取的URL内容
  • 对用户输入的URL进行严格验证和清理

第五部分:总结与练习

巩固知识,通过实践提升技能

学习目标

通过实际练习巩固HTTP协议和URL类的知识

知识总结

  • HTTP是基于TCP的应用层协议,使用请求-响应模型
  • URL类提供了统一资源定位符的高级抽象
  • URLConnection是访问网络资源的核心类
  • 必须正确处理异常和资源释放
  • 掌握状态码和重定向处理至关重要
  • 安全考虑是网络编程的重要部分

动手练习

完成以下练习巩固所学知识:

练习1:URL解析器

编写一个程序,接受URL字符串作为输入,解析并输出:

  • 协议
  • 主机名
  • 端口(如未指定则输出默认端口)
  • 路径
  • 查询参数
  • 锚点

练习2:简单HTTP客户端

创建一个HTTP客户端,能够:

  • 发送GET请求获取内容
  • 显示响应状态码和头信息
  • 将响应内容保存到文件
  • 支持设置超时时间
  • 处理重定向

练习3:API数据获取

使用JSONPlaceholder API完成以下任务:

  1. 获取用户ID为1的所有帖子
  2. 获取帖子ID为1的所有评论
  3. 创建一篇新帖子并输出服务器响应
  4. 更新现有帖子的标题
  5. 删除一篇帖子并检查响应状态码

API地址:https://jsonplaceholder.typicode.com/