参考:https://blog.csdn.net/xp5xp6/article/details/52350977
参考:https://blog.csdn.net/fangye945a/article/details/86530858
使用curl的post方式获取网页内容是常用的方式,这里就获取网页天气数据例子,遇到的一些问题进行记录。
参考的博客中的post获取天气数据的测试demo如下:
#include <stdio.h>
#include "curl/curl.h"
#define POSTFIELDS "city=changsha&appkey=8010132dcf54491a4eaa387f4db61774"
size_t recv_data(void *ptr, size_t size, size_t nmemb, void *stream)
{
printf("recv_data:%s\n",(char *)ptr);
return size * nmemb;
}
int main(int argc,char *argv[])
{
struct curl_slist* headers = NULL;
char *url = "https://way.jd.com/he/freeweather";
CURL *curl;
CURLcode res;
curl = curl_easy_init();
if( NULL != curl )
{
curl_easy_setopt(curl, CURLOPT_URL, url); //设置URL
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, POSTFIELDS); //设置post参数
curl_easy_setopt(curl, CURLOPT_POST, 1); //设置http发送协议为post
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, recv_data);//设置接收回调函数
res = curl_easy_perform(curl); //执行
curl_easy_cleanup(curl); //释放
}
return 0;
}
在Ubuntu下编译运行
gcc getweather.c -o getweather -I /home/linux/opt/curl/include/ -L/home/linux/opt/curl/lib/ -lcurl
在这里说明一下,我使用的curl版本是curl-7.57.0。在运行编译后的测试程序,无任何反应,然后我将测试代码中的res参数printf出来,运行如下图:
在curl.h头文件中找到了CURLcode=60代表的含义:
意思大概是遇到某些校验没通过。
curl error code 60
命令行加选项-k就可以
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, false);
curl error code 51
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, true);
CURLOPT_SSL_VERIFYHOST的值
设为0表示不检查证书
设为1表示检查证书中是否有CN(common name)字段
设为2表示在1的基础上校验当前的域名是否与CN匹配
而libcurl早期版本中这个变量是boolean值,为true时作用同目前设置为2,后来出于调试需求,增加了仅校验是否有CN字段的选项,因此两个值true/false就不够用了,升级为0/1/2三个值。
再后来(libcurl_7.28.1之后的版本),这个调试选项由于经常被开发者用错,被去掉了,因此目前也不支持1了,只有0/2两种取值。
测试代码修改后如下:
#include <stdio.h>
#include <stdbool.h>
#include "curl/curl.h"
#include <curl/easy.h>
#define POSTFIELDS "city=changsha&appkey=8010132dcf54491a4eaa387f4db61774"
size_t recv_data(void *ptr, size_t size, size_t nmemb, void *stream)
{
printf("recv_data:%s\n",(char *)ptr);
return size * nmemb;
}
int main(int argc,char *argv[])
{
struct curl_slist* headers = NULL;
char *url = "https://way.jd.com/he/freeweather";
CURL *curl;
CURLcode res;
curl = curl_easy_init();
if( NULL != curl )
{
curl_easy_setopt(curl, CURLOPT_URL, url); //设置URL
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, POSTFIELDS); //设置post参数
curl_easy_setopt(curl, CURLOPT_POST, 1); //设置http发送协议为post
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, false); //不校验证书
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, recv_data);//设置接收回调函数
res = curl_easy_perform(curl); //执行
printf("res=%d\n",res);
curl_easy_cleanup(curl); //释放
}
return 0;
}
编译运行后,可正常获取打印网页天气数据: