HTTP协议(一)| 青训营

一、HTTP(Hyper Text Transfer Protocol)协议介绍

1. 简介:

HTTP协议(超文本传输协议),它是基于TCP协议的应用层传输协议,简单来说就是客户端和服务端进行数据传输的一种规则,是互联网上最常用的协议之一。

2. 特征:

  1. 无状态性:指每个请求和响应之间都是相互独立的,服务器不会保存客户端的状态信息。而web应用是有状态的。
  2. 请求 响应:客户端发送请求给服务器,服务器处理请求并返回响应。其中请求方法包括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"><...

  1. 简单可扩展: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

其中:

  1. Safe(安全的):不会修改服务器的数据的方法
  2. Idempotent(幂等):同样的请求被执行一次与连续执行多次的效果是一样的,服务器的状态也是一样的。所有safe的方法都是Idempotent的。

2. 状态码

1692032172148.png

常见状态码:

状态码说明使用场景
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" 响应。

全部评论

相关推荐

2025-12-20 13:19
已编辑
曲阜师范大学 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务