我正在尝试向我的ESP32 *模块发送AT指令,但没有收到任何响应。我需要执行一个包含用户名和密码以及其他请求的POST请求。我没有正确构造这些文件,为此没有很多好的文档。
NOTE:因为出于隐私原因我无法共享完整的URL,因此我将使用相同长度的内容******** connected.com:443
将登录信息发送到******** connected.com/login(POST)正文{“ email”:“ myemail.ca”,“ password”:“ xxxxx”}
获取有关用户个人资料的信息******** connected.com/getRoutine(GET)查询参数username =“ bob”
我真的很想了解这些请求的结构,以便如果有人可以向我优雅地解释它,那就太好了!
[这是我尝试过的。。
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" } “
实际上,系统的某些部分可能是引起故障的原因:
让我们专注于最后一个。
POST在RFC 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个字节(错误!消息正文较短)。
由于这些原因,至少这些方面可以改进:
我希望这对您有帮助,即使这是一个初步的答案(我自己也无法尝试此请求)。但是,同样,您绝对需要嗅探TCP级别的数据包,以免在不确定确实接收到数据的情况下避免调试服务器!如果无法安装Wireshark,则tcpdump也可以。