400 Ошибка при отправке запроса GET на сервер с использованием AT-команд - PullRequest
0 голосов
/ 04 февраля 2020

, поэтому я пытаюсь использовать и Arduino Due и SIM7600 LTE Shield для отправки запроса GET на сервер. Я пробовал несколько серверов безрезультатно, и я не совсем уверен, что я делаю неправильно. Ниже приведены мои AT-команды

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

А ниже приведен ответ:

19:34:28.581 -> +CHTTPACT: DATA,295
19:34:28.581 -> http/1.1 400 bad request
19:34:28.581 -> server: nginx
19:34:28.581 -> date: tue, 04 feb 2020 19:34:27 gmt
19:34:28.581 -> content-type: text/html
19:34:28.581 -> content-length: 150
19:34:28.581 -> connection: close
19:34:28.581 -> 
19:34:28.581 -> <html>
19:34:28.581 -> <head><title>400 Bad Request</title></head>
19:34:28.615 -> <body>
19:34:28.615 -> <center><h1>400 Bad Request</h1></center>
19:34:28.615 -> <hr><center>nginx</center>
19:34:28.615 -> </body>
19:34:28.615 -> </html>
19:34:28.648 -> 
19:34:28.648 -> +CHTTPACT: 0

Существует определенное соединение inte rnet, так как оно возвращает пользовательские страницы ошибок с серверов, но я ' Я не уверен, почему он не может получить страницы, которые я хочу. Любая помощь будет по достоинству оценена

Спасибо

1 Ответ

0 голосов
/ 05 февраля 2020

Мне удалось получить ответ сервера со следующим запросом:

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 в своем запросе. Как блестяще объяснено в ответах на на этот вопрос , в этом поле указывается количество октетов, содержащихся в теле сообщения, после заголовка. Но:

  1. В журнале команд AT в вашем вопросе не упоминалось никакого тела после заголовка
  2. Как объяснено в этого ответа , тела запросов в запросах GET явно не запрещены, но они не рекомендуются

Да, вы можете отправить тело запроса с помощью GET, но это не должно иметь никакого значения. Если вы придаете ему значение, анализируя его на сервере и изменяя свой ответ на основании его содержимого, то вы игнорируете эту рекомендацию в HTTP / 1.1 spe c, раздел 4.3

...