使用AT命令向服务器发送GET请求时出现400错误

时间:2020-02-04 19:46:57

标签: html http arduino at-command gprs

所以我正在尝试使用Arduino Due和SIM7600 LTE Shield将GET请求发送到服务器。我尝试了多个服务器无济于事,而且我不确定自己做错了什么。下面是我的AT命令

import pandas as pd

df = pd.DataFrame({'ZIP_KEY': ['A', 'B','C', 'A', 'B', 'A'],
                   'start_month': [1, 2, 2, 6, 8, 10],
                   'end_month': [4, 3, 7, 7, 12, 12]})

df["list"] = df.apply(lambda x: list(range(x["start_month"], x["end_month"]+1)), 
                      axis=1)

df = df.explode("list")

df.groupby("list")["ZIP_KEY"].nunique()

以下是响应:

19:34:00.607 -> AT+CHTTPACT="website.co.uk",80
19:34:00.710 -> +CHTTPACT: REQUEST
19:34:07.533 -> GET website.co.uk/4gtest.php HTTP/1.0
19:34:12.302 -> Host: website.co.uk
19:34:19.101 -> Content-Length: 42
19:34:28.000 -> 
19:34:28.000 -> OK

肯定有Internet连接,因为它会从服务器返回自定义错误页面,但是我不确定为什么它无法获取我想要的页面。 任何帮助将不胜感激

谢谢

1 个答案:

答案 0 :(得分:0)

我已经能够通过以下请求获得服务器响应:

GET /4gtest.php HTTP/1.1<CR><LF>
Host: website.co.ukCR><LF>
<CR><LF>
<CR><LF>

我得到Error 404的响应,可能是因为它是当前已删除的测试页。无论如何,它不是Error 400的响应,至少意味着该请求没有格式错误。

有关请求的一些描述:

  1. GET命令之后,仅预期路径(由用户@juraj的注释正确建议)
  2. 由于您的错误响应指定了HTTP/1.1,因此我为请求使用了相同的版本
  3. 主机名在Host: website.co.uk行中传递
  4. 请注意,每行以<CR> + <LF>一对字符结尾(回车,0x13 ASCII,换行,0x10 ASCII)。指定它很重要,因为在您的问题中尚不清楚线是如何终止的
  5. 还请注意,在最后一行之后,一对<CR> + <LF>对会终止请求的标头部分

关于Content-Length

我在请求中省略了Content-Length字段。正如在this question的答案中很好地解释的那样,此字段指定消息正文中标头的 之后的八进制数。但是:

  1. 您问题中的 AT命令日志在标头后没有提及任何正文
  2. this answer中所述,未明确禁止GET请求中的请求正文,但不推荐使用

是的,您可以使用GET发送请求正文,但其中不应包含任何内容 含义。如果您通过在服务器上解析它来赋予它含义, 根据其内容更改响应,然后您将忽略 HTTP/1.1 spec, section 4.3

中的此建议