本文叙述C语言中结合socket 如何实现http POST请求,对于http协议相关内容可以查看HTTP协议详解。对于不带参数的post请求,只需要按照http格式发送即可。下面以带参数的POST请求为例。
1. C 语言Socket 实现带参数的 http post请求
C语言中可以使用snprintf 、strcat 等函数将字符串数据(http头和参数数据)按照http协议格式保存在buf中,再调用socket send函数发送buf的内容。
现有API接口: http://ABC.com:1234/rest/Prd/S_Prd_Devices/
POST请求, 参数:String macAddr, mac地址(长度为12);String pass,客户端验证字符串(长度为16);
返回:{“success”:true}
具体实现:
//str_mac、str_pass分别为参数字符串
// total_len 为参数数据的长度,参数数据发送时格式为mac=参数1&pass=参数2
int total_len = strlen(str_pass) +strlen(str_mac)+strlen("mac=")+strlen("&pass=");
int len;
unsigned char buf[256];
memset(buf, 0, 256);
snprintf(buf,sizeof(buf)-1,
"POST /rest/Prd/S_Prd_Devices/ HTTP/1.1\n"
"Host: ABC.com:1234\n"
"Content-Type: application/x-www-form-urlencoded\n"
"Content-Length: %d\r\n"
"\r\n"
"mac=%s&pass=%s",
total_len,
str_mac,
str_pass
);
len = strlen(buf);
printf("\nsendata:%s\n",buf);
sock_writen(fd, buf, len);
说明:发送的参数数据(即total_len)长度必须为准确的参数长度,否则服务器不知道接受多少数据。
2 格式说明
结合上述的post 实例,简单说明http 格式:
POST - 请求方法,向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。注意,GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连,如EditPosts.aspx?name=test1&id=123456. POST方法是把提交的数据放在HTTP包的Body中。
HTTP/1.1 :协议支持版本为1.1。
Host:请求域名。
Content-Type:用来表明request的表明类型。
Content-Length:表示请求消息正文的长度。例如:Content-Length: 38。对于带参数的post请求,该值为参数的长度。
3.状态码
有5种可能的值,如下表所示。
状态码 |
定义 |
说明 |
1XX |
信息 |
接收到请求,继续处理 |
2XX |
成功 |
操作成功地收到,理解和接受 |
3XX |
重定向 |
为了完成请求,必须采取进一步措施 |
4XX |
客户端错误 |
请求的语法有错误或不能完全被满足。 |
5XX |
服务器端错误 |
服务器无法完成明显有效的请求。 |