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
// 换行