使用ESP32上的AT命令发送HTTP请求

问题描述 投票:0回答:1

我正在尝试向我的ESP32 *模块发送AT指令,但没有收到任何响应。我需要执行一个包含用户名和密码以及其他请求的POST请求。我没有正确构造这些文件,为此没有很多好的文档。

NOTE:因为出于隐私原因我无法共享完整的URL,因此我将使用相同长度的内容******** connected.com:443

  1. 将登录信息发送到******** connected.com/login(POST)正文{“ email”:“ myemail.ca”,“ password”:“ xxxxx”}

    • 一旦获得令牌,我将提出其他请求。
  2. 获取有关用户个人资料的信息******** connected.com/getRoutine(GET)查询参数username =“ bob”

  3. 我真的很想了解这些请求的结构,以便如果有人可以向我优雅地解释它,那就太好了!

[这是我尝试过的。。

AT
OK

AT+CIPSTART="TCP","********connected.com",443
CONNECT
OK

AT+CIPSEND=48
> "GET ********connected.com:443/getUsersOnline"
OK
>
Recv 48 bytes

SEND OK
CLOSED

我已使用过的要求的邮寄请求

AT+CIPSEND=177 “POST \r Host: ********connected.com\r\n Accept: application/json\r\n Content-Length: 224r\n Content-Type: application/jsonr\n { "email":"myemail.com", "password":"myPassword" } “
http post embedded at-command esp32
1个回答
1
投票

实际上,系统的某些部分可能是引起故障的原因:

  1. 发送的AT命令(尚不清楚您如何检查服务器响应。响应可能会提供有关错误原因的线索)
  2. 服务器端应用似乎是一个自定义实现,也可能有错误
  3. POST请求可能格式错误

让我们专注于最后一个。

POSTRFC 7231中进行了描述,尽管它是一个晦涩的描述,没有示例,但它使一件事很清楚:实际上没有明确定义的标准...因为它严格取决于应用程序!

我还引用了对旧的SO question做出的出色回答的相关部分:

[收到POST请求时,您应该始终期望“有效负载”,或者以HTTP术语来说:消息正文。 消息主体本身是没有用的,因为没有标准

由于这个原因,我们所能做的就是建立一个尽可能准确的POST请求,然后对整个系统进行调试,以确保该请求与服务器端应用程序期望的相匹配。

为了做到这一点,让我们检查一下我发现的另一个外部链接:POST request examples。我们找到了此请求:

POST /test HTTP/1.1
Host: foo.example
Content-Type: application/x-www-form-urlencoded
Content-Length: 27

field1=value1&field2=value2

现在让我们将此示例与您的请求进行比较:

POST
Host: ********connected.com
Accept: application/json
Content-Length: 224
Content-Type: application/jsonr
{ "email":"myemail.com", "password":"myPassword" }

您在向服务器说您要将资源传递给未指定的应用程序(无路径),并且该资源的长度为224个字节(错误!消息正文较短)。

由于这些原因,至少这些方面可以改进:

  1. POST / path / invic18app.php HTTP / 1.1 //缺少应用程序和HTTP版本的路径
  2. Content-Length:48 //这必须是消息正文的长度,不包含标题。我也将其写为最后一个选项,就在消息正文之前
  3. 在消息正文前写两行空行,否则服务器会将其解释为其他(错误的选项)

我希望这对您有帮助,即使这是一个初步的答案(我自己也无法尝试此请求)。但是,同样,您绝对需要嗅探TCP级别的数据包,以免在不确定确实接收到数据的情况下避免调试服务器!如果无法安装Wireshark,则tcpdump也可以。

© www.soinside.com 2019 - 2024. All rights reserved.