- HTTP请求报文解析
- HTTP响应报文解析
- C++实现http发起GET请求
HTTP(Hyper Text Transfer Protocol,HTTP) 超文本传输协议,是一个简单的请求-响应协议。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。HTTP 是基于 TCP/IP 通信协议来传递数据的(HTML 文件、图片文件、查询结果等),默认工作在 TCP 协议 80 端口。 HTTP请求报文解析
http请求报文由3部分组成:请求行、请求头、请求体。
①是请求方法,GET和POST是最常见的HTTP方法,除此以外还包括DELETE、HEAD、OPTIONS、PUT、TRACE。不过,当前的大多数浏览器只支持GET和POST,Spring 3.0提供了一个HiddenHttpMethodFilter,允许你通过“_method”的表单参数指定这些特殊的HTTP方法(实际上还是通过POST提交表单)。服务端配置了HiddenHttpMethodFilter后,Spring会根据_method参数指定的值模拟出相应的HTTP方法,这样,就可以使用这些HTTP方法对处理方法进行映射了。
②为请求对应的URL地址,它和报文头的Host属性组成完整的请求URL。
③是协议名称及版本号。
④是HTTP的报文头,报文头包含若干个属性,格式为“属性名:属性值”,服务端据此获取客户端的信息。
⑤是报文体,它将一个页面表单中的组件值通过param1=value1&m2=value2的键值对形式编码成一个格式化串,它承载多个请求参数的数据。不但报文体可以传递请求参数,请求URL也可以通过类似于“/chapter15/user.html? param1=value1&m2=value2”的方式传递请求参数。
对照上面的请求报文,我们把它进一步分解,你可以看到一幅更详细的结构图:
常见的HTTP请求报文头属性
Accept -请求报文通过一个Accept报文属性告诉服务器,客户端接收什么类型的响应;Accept属性的值可以为一个或多个MIME类型的值,MIME格式:大类型/小类型[;参数]
Accept:text/plain
比如:
text/html,html文件
text/css,css文件
text/javascript,js文件
image
WSADATA wsdata;
WSAStartup(MAKEWORd(2, 2), &wsdata);
const char* hostname = "www.weather.com.cn";
struct hostent* host = gethostbyname(hostname);
sockaddr_in serveraddr;
serveraddr.sin_family = AF_INET;
serveraddr.sin_port = htons(80);
serveraddr.sin_addr.S_un.S_addr = *((int*)*host->h_addr_list);
int sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock == -1)
{
cout << "socket error" << endl;
return -1;
}
cout << "socket succeed" << endl;
if (::connect(sock, (struct sockaddr*)&serveraddr, sizeof(sockaddr_in)) == -1)
{
g_dwErr = GetLastError();
cout << "connect error" << endl;
closesocket(sock);
return -1;
}
cout << "connect succeed" << endl;
const char* bufSned = "GET http://www.weather.com.cn/data/sk/101190101.htmlrn";
if (send(sock, bufSned, strlen(bufSned), 0) > 0)
{
cout << "send succeed" << endl;
} else
{
g_dwErr = GetLastError();
cout << "send error, 错误编号: "<< g_dwErr << endl;
closesocket(sock);
return -1;
}
FILE *fp;
fp = fopen("get.txt","w");
char BufRecv[MAX_SIZE] = {};
int nLen = 0;
string HtmlData;
while ((nLen = recv(sock, BufRecv, MAX_SIZE, 0)) > 0)
{
fwrite(BufRecv, 1, nLen, fp);
HtmlData += BufRecv;
}
printf("BufRecv=%sn",BufRecv);
fclose(fp);
closesocket(sock);
return 0;
}



