HTTP协议:互联网通信的基石与核心技术解析

《HTTP协议:互联网通信的基石与核心技术解析》

一、HTTP协议的本质与结构

作为互联网通信的基础协议,HTTP定义了客户端与服务器之间的请求-响应规范:

  1. 请求结构

    • 首行包含方法(GET/POST等)和路径

    • 关键头部:

      http 复制代码
      User-Agent: Mozilla/5.0...  # 标识客户端类型(浏览器/爬虫)
      Referer: https://previous.page # 请求来源页(拼写应为Referrer)
      Cookie: sessionId=abc123     # 身份凭证
    • Body存放POST数据(JSON/表单/文件等)

  2. 响应结构

    • 状态行决定请求结果

    • 关键头部:

      http 复制代码
      Content-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技术解决了会话保持问题:

  1. 工作流程

    sequenceDiagram participant 客户端 participant 服务器 客户端->>服务器: 首次请求(无Cookie) 服务器-->>客户端: 响应头包含Set-Cookie 客户端->>服务器: 后续请求自动携带Cookie
  2. 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文件读写三种方式

  1. 基础流操作

    java 复制代码
    // 读取
    InputStream is = new FileInputStream(file);
    while((readInt = is.read()) != -1) {
        sb.append((char) readInt);
    }
    
    // 写入
    FileOutputStream fos = new FileOutputStream(file);
    fos.write(line.getBytes());
  2. 缓冲字符流

    java 复制代码
    // 高效读取
    BufferedReader br = new BufferedReader(new FileReader(file));
    String line;
    while((line = br.readLine()) != null) {
        lines.add(line);
    }
  3. NIO快捷操作

    java 复制代码
    // JDK7+ 单行读写
    List<String> lines = Files.readAllLines(file.toPath());
    Files.write(file.toPath(), lines);
相关推荐
北冥you鱼12 分钟前
Go Modules 使用指南:从入门到精通
开发语言·后端·golang
嘟嘟071717 分钟前
从零理解 MCP:手写一个本地 MCP Server 并接入 LangChain Agent
前端·后端
沈七18 分钟前
Go 补强第三天:给 TaskStore 写单元测试
后端
范闲22 分钟前
第二章:Octo v0.1.1:从「能用」到「好用」——终端 AI 聊天体验的全面升级
人工智能·后端
贰先生24 分钟前
Xiuno BBS 审计之问题03:附件上传高危风险
后端
Ai拆代码的曹操27 分钟前
记一次 K8s Pod Pending 排查:两层坑叠加,从资源到存储的完整复盘
后端
贰先生28 分钟前
Xiuno BBS 审计之问题04:Cookie 缺少 HttpOnly/Secure/SameSite 安全属性
后端
贰先生29 分钟前
Xiuno BBS 审计之问题06:硬编码 auth_key 加密密钥
后端
贰先生30 分钟前
Xiuno BBS 审计之问题02:后台用户搜索可能造成严重性能 DoS
后端
咪饭只吃一小碗33 分钟前
告别微调成本!用 RAG 本地向量库解决大模型私有领域数据接入
javascript·后端·面试