【Javaweb】http协议-请求与响应
引入:
我们在idea上运行程序后可以通过浏览器访问http://localhost:8080 来获取程序的返回结果,这是一个浏览器和服务器交互的过程。
服务器:(可以理解为ServerSocket)
- 接收到浏览器发送的信息(如:/hello)
- 在服务器上找到/hello的资源
- 把资源发送给浏览器
网络三要素
- IP :网络中计算机的唯一标识
- 端口 :计算机中运行程序的唯一标识
- 协议 :网络中计算机之间交互的规则
浏览器和服务器进行数据交互时用的协议是http协议。
“HTTP 协议就是基于 IP 和端口建立的连接之上,规定数据如何组织和传输的应用层协议。”
HTTP协议
学习HTTP主要就是学习请求和响应数据的具体格式内容。
请求协议
请求行 :
HTTP请求中的第一行数据。由: 请求方式 、 资源路径 、 协议/版本 组成(之间使用空格分隔)
请求头 :
第二行开始,上图黄色部分内容就是请求头。格式为key: value形式http是个无状态的协议,所以在请求头设置浏览器的一些自身信息和想要响应的形式。这样 服务器在收到信息后,就可以知道是谁,想干什么了
Host
: 请求的目标主机和端口号(HTTP/1.1 必需,用于虚拟主机)。User-Agent
: 告知服务器客户端的浏览器类型、版本等信息。Content-Type
: (对于 POST 非常重要) 指定请求体的格式,例如application/x-www-form-urlencoded
(表单默认)、multipart/form-data
(文件上传)、application/json
。Cookie
: 将之前服务器设置的状态信息发送给服务器。
post方式的请求
GET 的语义是 “获取” 数据。它应该用于从服务器读取(查询)信息,而不应该改变服务器上的任何状态。
POST 的语义是 “提交” 数据。它用于向服务器发送需要处理的数据,通常会导致服务器状态的改变(如更新、创建)。
POST 示例:用户登录
你点击登录按钮后,浏览器发出的请求URL可能是:
https://example.com/login
而你的用户名和密码则被放在看不见的请求体中传输
{"username": "myuser", "password": "mypass123"}
幂等性 (Idempotency) - 非常重要的概念
这是一个理解 RESTful API 设计的关键概念。
GET 是幂等的:意味着执行一次和执行多次效果完全一样。你只是获取数据,不会改变服务器状态。你刷十次百度搜索,搜索结果可能会变(因为数据本身更新了),但服务器端不会因为你的十次请求而产生十条新的搜索记录。
POST 是非幂等的:意味着每次执行都可能产生不同的结果。比如,你点击“下单”按钮(POST请求),第一次会创建一笔新订单。如果你因为网络卡顿而重复提交了多次,就可能会创建多个相同的订单。(因此,后端API设计必须考虑防止重复提交)。
比较
特性 | GET 方法 | POST 方法 |
---|---|---|
设计目的 | 获取数据(安全且幂等的读操作) | 提交数据(不安全的写操作) |
参数位置 | URL 查询字符串(?key=value) | 请求体(Request Body) |
参数可见性 | 可见(显示在地址栏) | 不可见(对用户隐藏) |
数据长度限制 | 有(因URL长度限制,通常几KB) | 理论上无(但服务器可能会限制) |
安全性 | 较差(参数直接暴露) | 相对较好(但仍需HTTPS保障) 如果网站没有使用 HTTPS 协议,POST 的数据包同样可以被网络上的抓包工具(如 Wireshark)轻松截获和查看 |
浏览器历史 | 参数保留在浏览器历史中 | 不保留 |
可缓存性 | 可被缓存 | 不可被缓存(通常) |
幂等性 | 幂等(多次执行效果相同) | 非幂等(多次执行可能产生不同结果) |
书签 | 可收藏为书签 | 不可收藏 |
后退/刷新 | 无害 | 浏览器会提示可能重新提交数据 |
主要用途 | 获取资源、搜索、筛选 | 创建资源、登录、提交表单、上传文件 |
响应协议
响应体包含服务器返回的实际数据,格式由Content-Type头指定:
text/html - HTML文档
application/json - JSON数据
application/xml - XML数据
image/jpeg - JPEG图像
text/css - CSS样式表
application/javascript - JavaScript代码
HTTP 状态码分类
状态码范围 | 类别 | 描述 |
---|---|---|
1xx | 信息性 | 请求已接收,继续处理 |
2xx | 成功 | 请求已成功接收、理解和接受 |
3xx | 重定向 | 需要进一步操作以完成请求 |
4xx | 客户端错误 | 请求包含语法错误或无法完成 |
5xx | 服务器错误 | 服务器未能完成有效的请求 |
2xx 成功
200 OK - 请求成功 这是程序员最想看到的响应码
201 Created - 资源创建成功(常用于POST请求)
202 Accepted - 请求已接受但尚未处理完成
204 No Content - 请求成功但无内容返回
3xx 重定向
301 Moved Permanently - 资源已永久移动到新位置
302 Found - 资源临时移动到不同位置
304 Not Modified - 资源未修改(使用缓存版本)
4xx 客户端错误
400 Bad Request - 请求语法错误
401 Unauthorized - 需要身份验证
403 Forbidden - 服务器理解请求但拒绝执行
404 Not Found - 请求的资源不存在
405 Method Not Allowed - 请求方法不被允许
5xx 服务器错误
500 Internal Server Error - 服务器内部错误
502 Bad Gateway - 网关或代理服务器收到无效响应
503 Service Unavailable - 服务暂时不可用
504 Gateway Timeout - 网关或代理服务器超时
补充:
“HTTP 协议本身是无状态(Stateless) 的,即服务器不会记住上一次的请求信息。每次请求都是独立的。为了维持用户状态(如登录信息),需要通过 Cookie/Session 等技术来弥补。”
在后面我们会遇到cookie会话技术,这个问题就能迎刃而解了!
总之,HTTP 协议是 Web 通信的基石。请求协议定义了客户端如何‘问’,响应协议定义了服务器如何‘答’。理解其格式、方法、状态码和头部字段,是进行 Web 开发、接口调试和性能优化的基础。