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"
应该可以解决问题。只需确保您的固件版本支持它。如果不是,请将固件版本更新为最新版本。
我正在使用 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"
应该可以解决问题。只需确保您的固件版本支持它。如果不是,请将固件版本更新为最新版本。