curl使用post方式獲取網頁天氣信息出現CURLcode=60解決方案

參考: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;
}

編譯運行後,可正常獲取打印網頁天氣數據:


 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章