7.7实现http请求
class httprequest
{
public:void Deserialize(std::string content){while (true){auto pos = content.find(sep);if (pos == std::string::npos){break;}std::string temp = content.substr(0, pos);if (temp.empty()){break;}req_header_.push_back(temp);content.erase(0, pos + sep.size());}auto pos = content.find(sep);text_ = content.substr(pos + sep.size());}void parse(){std::stringstream sstr(req_header_[0]);sstr >> method_ >> url_ >> httpversion_; // 默认以空格分割path_ = wwwroot;if (url_ == "/" || url_ == "/index.html"){path_ += "/";path_ += homepage;}else{path_ += url_;}}void debugprint(){std::cout << "---------------------" << std::endl;for (auto &e : req_header_){std::cout << e << std::endl;}std::cout << text_ << std::endl;std::cout << "method: " << method_ << std::endl;std::cout << "url: " << url_ << std::endl;std::cout << "http_version: " << httpversion_ << std::endl;std::cout << "path: " << path_ << std::endl;std::cout << "---------------------" << std::endl;}public:std::vector<std::string> req_header_;std::string text_;std::string method_;std::string url_;std::string httpversion_;std::string path_;
};
7.8http细节
http的方法
GET 获取资源
//提交的参数使用拼接到url结尾的方式提交;参数数量受限且不安全;
POST 传输实体主体
//提交的参数是放在了请求正文部分;
CONNECT 用隧道协议建立代理
数据都是通过表单提交的;
http状态码
常见的如200 OK,404 Not Found;
对于浏览器标准是有点的,但是支持的并不是很好;
对于重定向包括临时重定向和永久重定向,浏览器发送请求,服务器不是直接提供服务,而是返回一个响应;响应报头是3XX,location里是一个新的地址;浏览器收到后会重新向新地址发起一个请求;
临时重定向就是还是每次都要先访问服务器,然后服务器重定向,使用场景如:登录界面成功后跳转;
response_line = "HTTP/1.0 302 Found\r\n";
std::string response_header = "Content-Length: ";
response_header += std::to_string(text.size());
response_header += "\r\n";
response_header += "Location: https://www.qq.com\r\n";
response_header += "\r\n";
http常见的报头
Content-Type: 数据类型(text/html等),方便显示图片等资源;
Connection:表示是否在通信时选用长连接
Content-Length: Body的长度
Host: 客户端告知服务器, 所请求的资源是在哪个主机的哪个端口上;
User-Agent: 声明用户的操作系统和浏览器版本信息;
referer: 当前页面是从哪个页面跳转过来的;
location: 搭配3xx状态码使用, 告诉客户端接下来要去哪里访问;
Cookie: 用于在客户端存储少量信息. 通常用于实现会话(session)的功能;
一个页面是包含非常多的元素的,每个元素就是一个资源;
对于一个请求响应一个资源,然后关闭连接是短连接,http/1.0支持的就是短连接;而只建立一个连接,发送多个请求和响应是长连接,http/1.1支持的就是长连接;
http协议默认是无状态的;http有对登录用户的会话保持功能;
响应报头中有Set - Cookie字段,设置了属性值,发送给浏览器保存起来,这种保存了属性值的文件叫做cookie文件;浏览器每一次向该服务发起请求时,都会携带cookie文件中的内容;保存cookie文件一般有有文件级的方式iye有内存级的方式;对于内存级设计,浏览器启动后就变成了一个进程,在进程当中是可以new空间的,可以将cookie的内容保存在进程的内存当中,不往磁盘上写;如果是文件级设计会直接将cookie信息保存到文件当中;这个文件被保存的浏览器特定的安装路径下; cookie文件会自动删除;