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;
}

编译运行后,可正常获取打印网页天气数据:


 

 

 

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