目录
- 1. URL
- 2. HTTP 协议
- 2.1. HTTP 请求
- 2.2. HTTP 响应
 
 
1. URL
URL 表示着是统一资源定位符(Uniform Resource Locator), 就是 web 地址,俗称“网址”;
 每个有效的 URL 可以通过互联网访问唯一的资源, 是互联网上标准资源的地址;
URL 的主要由四个部分组成:
scheme :// host[:port] / path
- scheme(协议): 所使用的传输协议, 通常为 HTTP 协议或 HTTPS 协议;
- host(主机): 是资源所在的网站或服务器的名字, 又称为域名; 主机名也可以使用点分十进制的 IP地址 代替; 使用- ://与协议分隔;
- port(端口): 端口号, 通常会被省略, 表示使用协议默认的端口号; 使用- :与主机分隔;
- path(路径): 所访问资源的相对路径; 同时第一个- /可以分隔端口号和资源路径;
2. HTTP 协议
HTTP(超文本传输协议,HyperText Transfer Protocol) 是一种用于分布式、协作式、超媒体信息系统的应用层协议, 是基于 TCP/IP 通信协议来传输数据的;
HTTP 协议由 HTTP请求 和 HTTP响应 两部分组成
2.1. HTTP 请求
HTTP 请求由 请求行(request line), 请求头部(header), 空行和请求数据 四个部分组成;

-  请求行: 
 请求方法: 指定要执行的操作; 如 GET, POST, PUT, DELETE 等;
 URL : 请求的资源路径;
 协议版本: 协议的版本, 如 HTTP/1.0, HTTP/1.1, HTTP/2.0 等;
-  请求报头: 
 包含了请求的具体信息, 由多组 K : V 结构组成;
-  空行: 
 请求报头和有效载荷之间的分隔;
-  有效载荷: 
 包含要发送给服务器的数据, 可以为空;
| 方法 | 含义 | 
|---|---|
| GET | 从服务器获取资源 | 
| HEAD | 类似于 GET,但服务器只返回响应的头部,不返回实际数据 | 
| POST | 向服务器发送数据以创建新资源 | 
| PUT | 向服务器发送数据以更新现有资源。如果资源不存在,则创建新的资源 | 
| DELETE | 从服务器删除指定的资源 | 
| OPTION | 返回服务器支持的 HTTP 方法 | 
| TRACE | 回显服务器收到的请求 | 
| CONNECT | 建立一个到服务器的隧道,通常用于 HTTPS 连接 | 
那么就可以将浏览器视为客户端, 编写服务器, 通过 URL 的方式, 接收浏览器的 HTTP 请求;
 可以不做任何处理, 看一看 HTTP 请求;
具体代码实现: [HTTP 网页简易验证];
Server.cc
#include "Server.hpp"
#include "Http.hpp"
using call_back = function<Response(Request)>;
class Serve
{
public:
    Serve(call_back cb) : _cb(cb) {}
    void CallBack(shared_ptr<Socket> sockfd)
    {
        Request req;
        string buf;
        while (1)
        {
            // 接收
            int n = sockfd->Recv(buf);
            if (n <= 0)
            {
                LOG(FATAl, "Recv fail");
                break;
            }
			
			// 直接打印 Http 请求
            cout << buf << endl;
            
            // // 反序列化
            // req.DeSerialize(buf);
            // // 回调
            // Response resp = _cb(req);
            // // 序列化
            // string package;
            // resp.Serialize(package);
            // // 发送
            // sockfd->Send(package);
        }
    }
    call_back _cb;
};
int main(int argc, char *argv[])
{
    HttpServe hs;
    Serve serve(bind(&HttpServe::HandlerServe, &hs, placeholders::_1));
    TpcServer tpc(bind(&Serve::CallBack, &serve, placeholders::_1));
    tpc.Start();
    return 0;
}

2.2. HTTP 响应
HTTP 响应由 状态行, 响应报头, 空行和响应正文 四部分组成;

-  状态行: 
 协议版本: 协议的版本, 如 HTTP/1.0, HTTP/1.1, HTTP/2.0 等;
 状态码: 三位数, 表示请求的处理结果;
 状态码描述: 状态码的简短描述;
-  响应报头: 
 包含了响应的具体信息, 由多组 K : V 结构组成;
-  空行: 
 请求报头和有效载荷之间的分隔;
-  有效载荷: 
 包含服务器返回的数据, 如请求的网页内容, 图片, JSON数据等;
| 状态码 | 含义 | 
|---|---|
| 1xx | 表示通知信息,服务器收到请求,需要请求者继续执行操作 | 
| 2xx | 表示成功,操作被成功接收并处理 | 
| 3xx | 表示重定向,需要进一步的操作以完成请求 | 
| 4xx | 表示客户端错误,请求包含语法错误或无法完成请求 | 
| 5xx | 表示服务器错误,服务器在处理请求的过程中发生了错误 | 
可以通过 telnet 命令获取服务器的响应;
telnet baidu.com 80

输入 ^] (ctrl + ]) 连接服务器;

发出简易的请求;
// 换行
GET / HTTP/1.0
// 换行

![【MySQL-17】存储过程-[变量篇]详解-(系统变量&用户定义变量&局部变量)](https://i-blog.csdnimg.cn/direct/1dbf2ba9d33b46efbdbc8744b150b210.png)


















