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 = "param1=" + String(one_c1) +"¶m2=" + String(one_c2) + "&sensor=MTIzNDU1Njg3OQ=="; Serial.print("Requesting POST: "); // Send request to the server: client.println("POST /sensor/new HTTP/1.1"); client.println("Host: 165.227.163.172"); client.println("Accept: */*"); client.println("Content-Type: application/x-www-form-urlencoded"); client.print("Content-Length: "); client.println(data.length()); client.println(); client.print(data);Строку
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";