參考: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;
}
編譯運行後,可正常獲取打印網頁天氣數據: