序言
做个毕设要求要有天气预警,emm,行,上网整个API给他。
不就调用一个API的事嘛,切,然后在酒吧里面点了蛋炒饭(炸)了
问题一
首先,能够免费获取到天气预警的API只找到了一个,是HTTPS协议。问题不大,例程里面有https相关的代码,主要是获取SSL证书指纹,看到有教程里面说能用长期有效的指纹,但是实测在这个网站只能用短期指纹。
蛮简单的嘛
你已经学会怎么连接到API服务器了,现在开始获取数据吧!
地狱难度
为了得到目标数据,需要先发送一个GET请求,配合一些参数,服务器才会返回对应的数据
String url = "/v7/warning/now?location=" + location + \
"&lang=zh&key=1902689fcf164b3a8e36b1e11c68d81c";
Serial.print("Requesting URL: ");
Serial.println(url);
//开始请求天气数据
client.print(String("GET ") + url + " HTTP/1.1\r\n" +
"Host: " + host + "\r\n" +
"Connection: close\r\n\r\n");
服务器返回的信息是由响应标头和数据组成,响应标头与数据之间由”\r\n\r\n”作为间隔
其中一定要知道的是数据有没有GZIP压缩过,压缩过的数据是不能直接读取的,需要解压。
这下头大了,ESP8266没有现成的库,百度必应谷歌也没有,然后就到GitHub上面找,就找到一个,只能学着用呗。现在看来我真是傻,这就是个算法而已,只需要简单移植就能正常使用
要使用这个库的解压函数,需要知道源数据本身和他的长度,数据长度可以在响应标头读取
char *length_string = strcasestr(line.c_str(), "Content-Length:");
if (length_string) {
sscanf(length_string, "%*s%d", &resp_length);
}
然后就可以正常解析了,可喜可贺
总结
事后看来也没这么难嘛。。。。。。
但是还是很感谢以下两个帖子给的解决方法,阿里嘎多!
https://yuanze.wang/posts/esp32-unzip-gzip-http-response/
https://github.com/tignioj/ArduinoUZlib
感谢,真的非常感谢
您好,我最近也在研究关于此天气api的数据获取,也是ESP8266,但我在gzip解压的部分卡住了,文章我看了,想知道您具体的解决方法是什么,谢谢,如果您愿意帮助我通过邮箱和我联系吧
你好,以通过邮件将源码发送给你