使用 python 可以很容易地实现简单的 HTTP 请求,因为系统库封装了构建 HTTP 请求报文的底层操作,面向用户的是简单地函数调用,而通过 C语言 实现 HTTP 请求必须了解 HTTP 协议的原理,这里推荐经典的 《HTTP权威指南》 和入门的 《图解HTTP》
HTTP协议简介
HTTP报文分为请求报文和响应报文,报文分为三个部分:起始行,首部块和正文主题,这里着重谈谈请求报文的构建
另外,使用浏览器的调试工具->网络选项也能直观地分析每个HTTP请求的特征
C实现HTTP请求的细节
请求报文
请求报文的格式如下:
method 代表对 服务器 资源获取的动作,常见的有 get 和 post 。
requests-URL 代表请求的统一资源定位符,也就是完整的网页链接。
version 是 HTTP 版本,目前已 HTTP1.1 最为常见。
headers 表示请求报文的首部,常见的防盗链 refer ,浏览器信息 user-agent 等等都在这里定义,注意这里的每一项属性参数以每行末尾的 \n\r 来分隔。
响应报文
和请求报文类似,只介绍其独特的地方
status 和 reason-phrase 表示状态码和原因短语,比较常见的就是 200 OK , 404 Not Found , 502 Bad Gateway
entire body 报文的实体部分,一般来说就是发往浏览器的整个 HTML 文件,当然还有图片,二进制文件等等其他一些资源。
GET请求
创建socket
//定义的缓冲区用来存放socket发送和接受的数据 也就是HTTP请求和响应报文
char buff[2048];
int sockfd = socket( AF_INET, SOCK_STREAM, 0 );
if ( sockfd < 0 )
{
printf( "create socket error!\n" );
exit( -1 );
}
struct sockaddr_in serveraddr;
memset( &serveraddr, 0, sizeof(serveraddr) );
serveraddr.sin_family = AF_INET;
// HTTP服务 TCP 80端口
serveraddr.sin_port = htons( 80 );