Http Post 快速使用
Posted Pou光明
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Http Post 快速使用相关的知识,希望对你有一定的参考价值。
一直对http很陌生,这次借助libcurl分享一个快速使用http post的案例。
平台:ubuntu16.04
一、libcurl的安装
1. Git上下载 master最新代码
https://github.com/curl/curl.git
我是下载的Zip包,git clone有点慢
2. 编译只有configure.ac文件和Makefile.am文件的工程
源码包还可以用cmake编,但是我失败了;所以用的传统./configure方式。
张宇说,没有条件创造条件,所以构造configure文件。
libtoolize
aclocal
autoheader
autoconf
automake --add-missing
这个流程亲测可用!可以写个脚本文件,以后直接用就行。注意缺什么安什么就行了。
3. 配置configure参数
./configure --prefix=/opt/libcurl --without-ssl
不使用ssl;设置安装路径为/opt/libcurl,方便以后移除。
4. 传统技能
make
sudo make install
二、使用Python搭建http server
Libcurl是有例子的,在/curl-master/docs/examples下。显然我没有仔细看,直接在网上搜别人怎么用的,然后没用明白,悲伤。
没有一个server,太难测试了,而搭建server又太难,恰好python解决了这个棘手的问题。只需6行就可以完美解决。
from bottle import route, request, run
@route('/hello', method=['GET', 'POST'])
def dh():
return 'hello ' + request.query.str
if __name__ == "__main__":
run(host='0.0.0.0', port=8080, reloader=True)
需要安装python bottle 才可以运行,步骤如下:
sudo apt install python-pip
python2 -m pip install bottle
注:使用的是python2测试的
运行效果如下:
三、libcurl Post例子
libcurl 的Post功能只是它众多功能中的一个,其他的我用不到,就不介绍了。
使用cmake构建的工程,主测试程序如下:
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include "curl.h"
int httpPost( uint8_t * strPost, uint32_t msg_size)
{
FILE *fpBody = NULL;
FILE *fpHeadData = NULL;
if ((fpBody = fopen("BodyData", "w")) == NULL) // 返回body用文件存储
return -1;
if ((fpHeadData = fopen("HeaderData", "w")) == NULL) // 返回head用文件存储
return -1;
CURLcode ret;
struct curl_slist *headers=NULL;
CURL* curl = curl_easy_init();
if(NULL == curl)
{
return CURLE_FAILED_INIT;
}
curl_easy_setopt(curl, CURLOPT_POST, 1); //设置为post方式
//设置内容类型,可以设置为json,本次测试未使用
// headers = curl_slist_append(headers, "Content-Type: application/octet-stream");
curl_easy_setopt(curl, CURLOPT_URL,"http://127.0.0.1:8080/hello?str=world");; //设置URL
//curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); // 改协议头
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, strPost); //设置post buf
curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, msg_size); //设置buf大小,上次就是被坑在这里了
curl_easy_setopt(curl, CURLOPT_WRITEDATA, fpBody); //将返回的bosy数据输出到fp指向的文件
curl_easy_setopt(curl, CURLOPT_HEADERDATA, fpHeadData); // 将返回的http头输出到fp指向的文件
curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);
curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 3); //超时时间为3秒
curl_easy_setopt(curl, CURLOPT_TIMEOUT, 3);
ret = curl_easy_perform(curl); //执行
curl_easy_cleanup(curl); //释放资源
curl_slist_free_all(headers); //释放资源
if(ret != CURLE_OK)
{
fprintf(stderr, "curl_easy_perform() failed: %s\n",curl_easy_strerror(ret));
}
return ret;
}
int main()
{
uint8_t postData[] = "postContent"; // 未使用
httpPost( postData, strlen(postData));
return 0;
}
说下流程:
现在我也不是很懂这些流程,按照相应的格式设置,能和对方server通信即可。
Server说明如下:
①请求类型Http Post
②Http Content-Type: application/octet-stream
效果如下:
四、总结
如何快速使用别人的库。
生活挺像数学的:已知条件就是你的当下,要你解的却是未来的你。
你说谁能知道未来的自己会是什么样?但是有人数学分就是比你高。
由现在是可以大概知道未来的自己会是什么样的~ ~ ~
以上是关于Http Post 快速使用的主要内容,如果未能解决你的问题,请参考以下文章