《HTTP协议:互联网通信的基石与核心技术解析》
一、HTTP协议的本质与结构
作为互联网通信的基础协议,HTTP定义了客户端与服务器之间的请求-响应规范:
-
请求结构:
-
首行包含方法(GET/POST等)和路径
-
关键头部:
httpUser-Agent: Mozilla/5.0... # 标识客户端类型(浏览器/爬虫) Referer: https://previous.page # 请求来源页(拼写应为Referrer) Cookie: sessionId=abc123 # 身份凭证
-
Body存放POST数据(JSON/表单/文件等)
-
-
响应结构:
-
状态行决定请求结果
-
关键头部:
httpContent-Type: application/json # 响应体类型 Set-Cookie: sessionId=abc123 # 设置客户端Cookie
-
二、状态码:HTTP的"语言"
分类 | 含义 | 常见状态码 |
---|---|---|
1xx | 信息性响应 | 101 协议切换 |
2xx | 成功 | 200 OK |
3xx | 重定向 | 301 永久移动 |
4xx | 客户端错误 | 404 未找到,405 方法不被允许 |
5xx | 服务器错误 | 500 内部服务器错误 |
特殊状态码趣闻:
- 418 I'm a teapot:来自1998年愚人节玩笑(RFC2324)
- 451 Unavailable For Legal Reasons:源于《华氏451度》小说
三、HTTP无状态与Cookie机制
HTTP本质是无状态协议,Cookie技术解决了会话保持问题:
-
工作流程 :
sequenceDiagram participant 客户端 participant 服务器 客户端->>服务器: 首次请求(无Cookie) 服务器-->>客户端: 响应头包含Set-Cookie 客户端->>服务器: 后续请求自动携带Cookie -
Java模拟带Cookie请求 :
java// 创建带Cookie的请求 HttpGet httpGet = new HttpGet("http://example.com/protected"); httpGet.addHeader("Cookie", "sessionId=abc123"); // 执行请求并获取响应 try (CloseableHttpResponse response = httpClient.execute(httpGet)) { String html = IOUtils.toString(response.getEntity().getContent(), "UTF-8"); System.out.println(html); }
四、反爬虫实战:Header伪装
通过设置User-Agent模拟浏览器行为:
java
// 伪装成Chrome浏览器
httpGet.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64)");
httpGet.addHeader("Accept-Language", "zh-CN,zh;q=0.9");
五、Java文件读写三种方式
-
基础流操作:
java// 读取 InputStream is = new FileInputStream(file); while((readInt = is.read()) != -1) { sb.append((char) readInt); } // 写入 FileOutputStream fos = new FileOutputStream(file); fos.write(line.getBytes());
-
缓冲字符流:
java// 高效读取 BufferedReader br = new BufferedReader(new FileReader(file)); String line; while((line = br.readLine()) != null) { lines.add(line); }
-
NIO快捷操作:
java// JDK7+ 单行读写 List<String> lines = Files.readAllLines(file.toPath()); Files.write(file.toPath(), lines);