HTTP协议(一)| 青训营
一、HTTP(Hyper Text Transfer Protocol)协议介绍
1. 简介:
HTTP协议(超文本传输协议),它是基于TCP协议的应用层传输协议,简单来说就是客户端和服务端进行数据传输的一种规则,是互联网上最常用的协议之一。
2. 特征:
- 无状态性:指每个请求和响应之间都是相互独立的,服务器不会保存客户端的状态信息。而web应用是有状态的。
- 请求 响应:客户端发送请求给服务器,服务器处理请求并返回响应。其中请求方法包括HTTP方法(GET,POST,PUT,DELETE等)和资源路径组成;响应方法包含状态码(200,404等)、头部信息和数据。
// HTTP请求
GET / HTTP/1.1
Host: www.example.com
User-Agent: xxxxxxxx
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
// HTTP响应
HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 100
Date: Sat, 14 Aug 2023 10:00:00 GMT
Server: ExampleServer/1.0
<!doctype html> <html lang="zh-cn"><...
- 简单可扩展:HTTP 允许通过添加自定义的头部字段(Headers)来扩展其功能。这使得开发者可以定义和传递自定义的元数据。
二、协议分析 - 报文
1.方法(method):
| GET(安全的、幂等) | 用于请求指定资源的信息。请求行中的方法是 GET,没有请求体,数据通过 URL 传递。 | GET /example.html HTTP/1.1 |
| POST | 用于向服务器提交数据,可能会引起服务器状态变化。请求体中包含提交的数据。 | POST /submit-form HTTP/1.1 |
| PUT(幂等) | 用于请求服务器存储一个资源,如果资源已存在,则更新该资源。请求行中的方法是 PUT,请求体中包含要存储的数据。 | PUT /update-resource HTTP/1.1 |
| DELETE(幂等) | 用于请求删除指定的资源。请求行中一般没有请求体。 | DELETE /delete-resource HTTP/1.1 |
| HEAD(安全的、幂等) | 类似于 GET,但服务器只返回头部信息,不返回实际内容。用于检查资源的元数据。 | HEAD /resource-info HTTP/1.1 |
| CONNECT | 用于建立网络连接,通常用于代理服务器。 | CONNECT www.example.com:443 HTTP/1.1 |
| OPTIONS(安全的、幂等) | 用于请求服务器支持的通信选项,如支持的方法和头部信息。 | OPTIONS /supported-options HTTP/1.1 |
| TRACE | 用于在网络路径上追踪请求和响应,主要用于诊断。 | TRACE /trace-path HTTP/1.1 |
| PATCH | 用于对资源进行局部修改。 | PATCH /modify-resource HTTP/1.1 |
其中:
- Safe(安全的):不会修改服务器的数据的方法
- Idempotent(幂等):同样的请求被执行一次与连续执行多次的效果是一样的,服务器的状态也是一样的。所有
safe的方法都是Idempotent的。
2. 状态码
常见状态码:
| 200 OK | 表示请求成功,服务器成功处理了客户端的请求 | 通常用于 GET 请求成功返回资源、POST 请求成功创建资源等情况 |
| 201 Created | 表示请求成功,并且服务器创建了新资源 | 通常用于 POST 请求成功创建新资源时返回 |
| 401 Unauthorized | 表示客户端未经身份验证或验证失败,无权访问请求的资源 | 需要用户登录或提供有效身份验证的情况 |
| 404 Not Found | 表示请求的资源在服务器上未找到 | 请求的URL路径不存在 |
| 502 Bad Gateway | 表示服务器作为网关或代理,从上游服务器接收到无效的响应 | 代理服务器转发请求时发生错误 |
3. 常用请求头
| Content-Type | 用于指定请求体的媒体类型(如 JSON、XML、表单等) | application/x-www-form-urlencoded |
| Accept | 用于指定客户端所期望接收的响应内容类型 | Accept: text/html, application/xhtml+xml, application/xml;q=0.9, */*;q=0.8 |
| Cookie | 用于在请求中发送保存在客户端的 Cookie 信息 | Cookie:sessionID=abcdef12345; userID=54321 |
| User-Agent | 用于标识发起请求的用户代理(浏览器、应用程序等)的信息 | User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 |
常用响应头
| Content-Type | 服务器返回的实体内容的类型 | Content-Type: application/json |
| Cache-Control | 用于指定响应的缓存控制行为,控制客户端和中间缓存如何缓存响应 | Cache-Control: max-age=3600 |
| Last-Modified | 用于表示资源的最后修改时间,用于缓存验证,配合 If-Modified-Since 使用 | Last-Modified: Sat, 14 Aug 2023 10:00:00 GMT |
| ETag | 用于表示资源的标识符,用于缓存验证,配合 If-None-Match 使用 | ETag:"abc123" |
三、HTTP实战
1. GET请求
const http = require('http');
const querystring = require('querystring');
const server = http.createServer(function (req, res) {
console.log('method:', req.method); // GET
const url = req.url
console.log('url:', url);
req.query = querystring.parse(url.split('?')[1])
console.log('query:', req.query);
res.end(JSON.stringify(req.query));
})
server.listen(3000,()=>{'server is listening on port 3000'})
这段代码创建了一个简单的 HTTP 服务器,它可以接收客户端的请求并返回查询字符串中的参数。当你向该服务器发送一个带有查询字符串的请求,它会解析查询字符串,并将解析后的参数作为 JSON 格式的响应返回给客户端。
2. POST请求
const http = require('http');
const querystring = require('querystring');
const server = http.createServer(function (req, res) {
if(req.method === 'POST'){
console.log('req content-type:', req.headers['content-type']);
//接收数据
let data = ''
req.on('data',chunk=>{
postData += chunk.toString()
})
req.on('end',()=>{
console.log('data:', data);
res.end('hello world')
})
}
})
server.listen(3000,()=>{'server is listening on port 3000'})
这段代码创建了一个简单的 HTTP 服务器,它可以接收客户端发送的 POST 请求,并处理请求中的数据。当向该服务器发送一个 POST 请求,并在请求中发送数据,服务器会接收并处理这些数据,然后返回一个 "hello world" 响应。


