【问题标题】:AT Commands HTTP request to JSON source with status 200 but empty responseAT 命令对 JSON 源的 HTTP 请求,状态为 200,但响应为空
【发布时间】:2020-07-21 12:42:26
【问题描述】:

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

我正在使用以下 AT 命令,模块执行请求,但我收到没有正文/响应的 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
-> 

什么都不显示。

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

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

【问题讨论】:

  • 网址不应该以http://开头吗?你还打错了HTTPPARA
  • 嘿,url 是否以 http:// 开头没有区别。它也给了我空洞的回应。是的,当然,缺少一个 P,只是复制时出错。
  • 您可以从任何其他页面执行 GET 吗?
  • 是的,但我注意到,另一个(工作)请求返回 html 代码而不是 jsons。会不会是个问题?
  • 这不是您的响应页面的问题,而不是您的脚本的问题吗?

标签: json arduino httpresponse at-command sim900


【解决方案1】:

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 模块(参见 Simcom AT Commands guide)中指定 HTTP 参数的命令是 AT+HTTPPARA,您已经在脚本中使用了它。它的语法是

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

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

“内容”
用于设置HTTP头中的“Content-Type”字段

因此命令

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

应该成功。只要确保您的固件版本支持它。如果没有,请将固件版本更新为最新版本。

【讨论】:

    猜你喜欢
    • 2023-02-20
    • 2017-10-31
    • 2020-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-26
    • 2015-09-30
    相关资源
    最近更新 更多