Официальный сайт компании Arduino по адресу arduino.cc
POST и GET запросы
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
День добрый, уже неделю лажу по разным форумам и гайдам и никак не могу адекватно настроить POST запрос на сервер.
Есть ESP8266-01 которая выполняет роль веб-сервера и тупо печатает все приходящие данные (получение конкретных переменных вообще не важно, лишь бы увидеть что хоть что-то пришло)
#include <ESP8266WiFi.h> const char* ssid = "ASUSASUS"; const char* password = "12345678"; WiFiServer HTTP(80); WiFi.begin(ssid, password); delay(7000); HTTP.begin(); Serial.begin(115200); Serial.print("Server address:"); Serial.println(WiFi.localIP()); } void loop() { WiFiClient client = HTTP.available(); while(client.available()) { char chr = client.read(); // чтение символа Serial.write(chr); } }
Если зайти на полученный айпи в браузере, увидим что получен GET запрос.
И также есть вторая ESP с кодом:
#include <ESP8266WiFi.h> const char* ssid = "ASUSASUS"; const char* password = "12345678"; const char* host = "192.168.0.7"; void setup() { Serial.begin(115200); delay(100); Serial.println(); Serial.println(); Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); } void loop() { WiFiClient client; const int httpPort = 80; if (!client.connect(host, httpPort)) { Serial.println("connection failed"); return; } String data = "pst=temperature>" + String(random(0,100)) +"||humidity>" + String(random(0,100)) + "||data>text"; Serial.print("Requesting POST: "); // Send request to the server: client.println("POST / HTTP/1.1"); client.println("Host: 192.168.0.7"); client.println("Accept: */*"); client.println("Content-Type: application/x-www-form-urlencoded"); client.print("Content-Length: "); client.println(data.length()); client.println(); Serial.print(data); client.print(data); delay(2000); // Can be changed if (client.connected()) { client.stop(); // DISCONNECT FROM THE SERVER } Serial.println(); Serial.println("closing connection"); delay(5000); }
Которая должна отправить на сервер пост запрос с рандомными числами.
Если запустить ее, будет видно что подключение и к вай фаю есть, а также данные передаются, но на стороне сервера абсолютная тишина, нет не единой строчки, при том что GET запрос с той же ESP приходит.
Кто подскажет в чем может быть беда и как исправить? Буду очень благодарен и могу скинуть на хлебушек)
println() правильные вставляет терминаторы строк? Вроде в пакете \r\n должно итить, а println() может недокладывать \r.
Послушайте компом с Wireshark - так надёжней, чем второй ардуиной. Мошт в IP-адресах запутались.
Т.е. предлагать почитать RFC по HTTP - не стоит, я так понял? Там всё написано по формат POST-запроса и про различные схемы кодирования. Это единственно верный и правильный источник данных для понимания сути. На всякий, для ознакомления с этим семейством RFC, волшебные слова для гугля есть "HTTP RFC".
Да там не в этом дело, имхо. Для application/x-www-form-urlencoded допустимы, емнип, только alphanumeric characters в данных, остальные должны быть percents encoded в формате %HH. А у автора, в данных - и | и >, и вообще - они не wellformed, поскольку не имеют вид key=val&key2=val2
Т.е. предлагать почитать RFC по HTTP - не стоит, я так понял? Там всё написано по формат POST-запроса и про различные схемы кодирования. Это единственно верный и правильный источник данных для понимания сути. На всякий, для ознакомления с этим семейством RFC, волшебные слова для гугля есть "HTTP RFC".
Ооо, я давно мечтал с тобой познакомиться) Огромное количество ответов на вопросы людей и 0 полезной информации на массу) Думаешь я сам не знаю что нужно перечитывать все по HTTP? Только у меня нет столько времени и нахер не нужно, ради одной задачи) Именно поэтому я прошу исправить мой скрипт и указать на ошибку, и готов скинуть за это на хлебушек) А ты, хлебушек, пойми, если люди пишут сюда с простой и тупой проблемой, у них нет ни времени, ни желания перечитывать несколько томов по данной тематике, это все равно что учить китайский с нуля, вместо того чтобы зайти в переводчик или спросить как переводиться одно слово.
Спасибо, попробую поиграться с \r и посмотреть че там приходит на комп
А ты, хлебушек, пойми, если люди пишут сюда с простой и тупой проблемой, у них нет ни времени, ни желания перечитывать несколько томов по данной тематике
если у тебя "нет ни времени ни желания" разбираться со своей проблемой - почему это желание появится у кого-то еще?
Пиши в коммерческий раздел, плати деньгу - тебе все решат. А в форуме помогают. когда ты решаешь сам, а не делают за тебя.
Даже если бы оно было не wellformed, дамп бы виден был на второй еспшке. Он явно или не туда ломится или порт забыл открыть.
А ты, хлебушек, пойми,
Я-то давно всё про тебя понял: то - что ты банальная тупая ленивая жопа, которая ищет причину, а не возможность. Времени у него нет, глядите-ка! Вместо того, чтобы тут истерить на форуме, пить дешёвое пойло и грызть семечки - займись делом, кусок недоразумения. Глядишь, и разовьёшься до уровня нижней ступени высших приматов, ещё не всё потеряно, надеюсь.
А тебя не смущает, что ТС пишет, что от той же ESP GET-запрос приходит? Имхо, дело таки в том, что там с форматом запроса - не айс. Впрочем, мне похер, я хлебушек, и читаю RFC.
Для меня первое - это коннект проверить. Поэтому я и советую на вайршарк ломанутся - сразу будет видно что почём. Вайршарк покажет, что в пакете не так.
Строку
String data =
"pst=temperature>"
+ String(random(0,100)) +
"||humidity>"
+ String(random(0,100)) +
"||data>text"
;
Заменить
String data =
"temperature="
+ String(random(0,100)) +
"&humidity="
+ String(random(0,100)) +
"&data=text"
;