AT 命令对 JSON 源的 HTTP 请求,状态为 200 但响应为空

AT Commands HTTP request to JSON source with status 200 but empty response

我正在使用 Arduino Mega 和 SIM900 GSM/GPRS shield 来针对我自己的 API 发出获取请求。

我正在使用以下 AT 命令,模块执行了请求,但我收到了一个没有 body/response 的 200 响应代码。

这是我的代码:

AT+SAPBR=3,1,"Contype","GPRS"
AT+SAPBR=3,1,"APN","my.apn.com"
AT+SAPBR=1,1
AT+SAPBR=2,1
AT+HTTPPARA="CID",1
AT+HTTPPARA="URL","wbs-api.eu-gb.cf.appdomain.cloud/stats"

AT+HTTPACTION=0
-> 0,200,0 (as output of the command)

据我所知,最后一个0代表响应体的字节大小

如果我进一步执行

AT+HTTPREAD
-> 

没有显示。

我的答案消失到哪里了,为什么是空的?

注意:我实际上能够成功获取执行对不同服务器的请求的数据,但我注意到工作请求returnsHTML 代码而不是 JSON 数据。

TL;DR

配置接受的内容类型

AT+HTTPPARA="CONTENT","application/json"

问题分析

既然您确实能够从不同的站点接收数据,这意味着问题一定是您正在访问的地址所特有的。

差异实际上在于应用程序类型,因为您正在下载JSON数据。下图显示了从服务器获得的响应的 Wireshark 捕获:

Content-type: application/json

但是这个请求在某种程度上是“特殊的”吗?下图显示了从我的浏览器发送到服务器的请求的 Wireshark 捕获:

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\r\n

所以我们可以理解这可能是接受类型的问题。


解决方法:SIM900模块上的内容类型

用于在 Simcom 模块中指定 HTTP 参数的命令(参见 Simcom AT Commands guide)是 AT+HTTPPARA,您已经在脚本中使用了它。它的语法是

AT+HTTPPARA=<HTTPParamTag>,<HTTPParamValue>[<UserdataDelimiter>]

HTTPParamTag参数有多个允许值,但其中一个选项是

"CONTENT"
Used to set the “Content-Type” field in HTTP header

因此命令

AT+HTTPPARA="CONTENT","application/json"

应该可以解决问题。只需确保您的固件版本支持它。如果不是,请将固件版本更新为最新版本。