一个HTTP请求报文由请求行(request line)、请求头部(header)、空行和请求数据4个部分组成
使用C++组装上述报文
boost::asio::streambuf request;
std::ostream request_stream(&request);
request_stream << "POST /cs/restfull/operationRestfullApi/excuteSqlByCode HTTP/1.1\r\n";
request_stream << "Host: 192.168.0.88:8080\r\n";
//request_stream << "Connection: keep-alive\r\n";
request_stream << "Content-Length: " << strEncodeBuffer.size() << "\r\n";
request_stream << "Content-Type: application/x-www-form-urlencoded; charset=UTF-8\r\n";
//request_stream << "User-Agent: Mozilla/4.0\r\n";
//request_stream << "Accept-Language: zh-CN\r\n";
request_stream << "\r\n";
request_stream << strEncodeBuffer;
请求行
request_stream << "POST /cs/restfull/operationRestfullApi/excuteSqlByCode HTTP/1.1\r\n";
请求头部
request_stream << "Host: 192.168.0.88:8080\r\n";
request_stream << "Connection: keep-alive\r\n";
request_stream << "Content-Length: " << strEncodeBuffer.size() << "\r\n";
request_stream << "Content-Type: application/x-www-form-urlencoded; charset=UTF-8\r\n";
//request_stream << "User-Agent: Mozilla/4.0\r\n";
//request_stream << "Accept-Language: zh-CN\r\n";
空行
request_stream << "\r\n";
说明:最后一个请求头之后是一个空行,发送回车符和换行符,通知服务器以下不再有请求头
请求数据
request_stream << strEncodeBuffer;
说明:请求数据不在GET方法中使用,而是在POST方法中使用。
POST方法适用于需要客户填写表单的场合。与请求数据相关的最常使用的请求头是Content-Type和Content-Length
注意
使用Boost库asio组件的时候,建立的套接字,如果没有设置TIME_WAIT的资源销毁时间,会导致网络套接字回收缓慢,建议使用代码如下:
io_service iosev;
ip::tcp::socket socket(iosev);
socket.open(boost::asio::ip::tcp::v4());
//TIME_WAIT回收资源时间
boost::asio::socket_base::linger option(true, 0);
socket.set_option(option);
注意
配置连接IP地址和端口的时候,需要注意如果传递的IP地址如下:"537MainStreet"会导致程序崩溃异常如果没有使用ec捕获异常
ip::tcp::endpoint ep(ip::address_v4::from_string(strIP), nPort);
正确代码
boost::system::error_code ec;
ip::tcp::endpoint ep(ip::address_v4::from_string(strIP, ec), nPort);
采用asio库的时候,需要更多的注意ec的使用,否则需要使用try catch捕获异常,否则导致程序崩溃