之前写过两个socket封装的HTTP GET请求,可是知其然,不知所以然。这次写POST请求就有点懵逼了。
还是从大佬的文章出发:https://blog.csdn.net/a19881029/article/details/14002273
请求的格式如图,严格按照这个格式,否则服务器返回400
1、每个HTTP选项末尾都加\r\n
2、HTTP选项的末尾要加上一个空白行,所以末尾要\r\n\r\n
3、POST请求正文放在HTTP请求的最后
键值对:IMEI=%s&model=%s&modelDetail=%s¤tVersion=%s&operator=%d%02d&language=%s
sprintf(buf,"POST /phone/rom/active HTTP/1.1\r\nHost: %s\r\nConnection: close\r\nContent-Type: application/x-www-form-urlencoded\r\nContent-Length: %d\r\nAccept: */*\r\n\r\n%s\r\n", g_sale_domain, strlen(json), json);
json存放了格式化好的键值对。
选项说明
1、Connection 头(header) 决定当前的事务完成后,是否会关闭网络连接。如果该值是“keep-alive”,网络连接就是持久的,不会关闭,使得对同一个服务器的请求可以继续在该连接上完成。
2、Content-Type
application/x-www-form-urlencoded
:数据被编码为名称/值对。这是标准的编码格式。multipart/form-data
: 数据被编码为一条消息,页上的每个控件对应消息中的一个部分。text/plain
: 数据以纯文本形式(text/json/xml/html)进行编码,其中不含任何控件或格式字符。postman软件里标的是RAW
application\json格式,C可以通过CJson去封装json数据,再通过POST发送请求
3、Content-Length请求实体长度,一开始只设置了Content-Type:application/x-www-form-urlencoded没有设置
Content-Length,导致服务器一直无法接受到我的请求参数。。
4、Accept
请求头用来告知客户端可以处理的内容类型,这种内容类型用MIME类型来表示。借助内容协商机制, 服务器可以从诸多备选项中选择一项进行应用,并使用 Content-Type
应答头通知客户端它的选择
5、Host:域名