POST и GET запросы

NewAge747
Offline
Зарегистрирован: 28.05.2020

День добрый, уже неделю лажу по разным форумам и гайдам и никак не могу адекватно настроить 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 приходит.

Кто подскажет в чем может быть беда и как исправить? Буду очень благодарен и могу скинуть на хлебушек)

sadman41
Offline
Зарегистрирован: 19.10.2016

println() правильные вставляет терминаторы строк? Вроде в пакете \r\n должно итить, а println() может недокладывать \r.
Послушайте компом с Wireshark - так надёжней, чем второй ардуиной. Мошт в IP-адресах запутались.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Т.е. предлагать почитать RFC по HTTP - не стоит, я так понял? Там всё написано по формат POST-запроса и про различные схемы кодирования. Это единственно верный и правильный источник данных для понимания сути. На всякий, для ознакомления с этим семейством RFC, волшебные слова для гугля есть "HTTP RFC".

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

sadman41 пишет:
println() правильные вставляет терминаторы строк? Вроде в пакете \r\n должно итить, а println() может недокладывать \r. Послушайте компом с Wireshark - так надёжней, чем второй ардуиной. Мошт в IP-адресах запутались.

Да там не в этом дело, имхо. Для application/x-www-form-urlencoded допустимы, емнип, только alphanumeric characters в данных, остальные должны быть percents encoded в формате %HH. А у автора, в данных - и | и >, и вообще - они не wellformed, поскольку не имеют вид key=val&key2=val2

NewAge747
Offline
Зарегистрирован: 28.05.2020

DIYMan пишет:

Т.е. предлагать почитать RFC по HTTP - не стоит, я так понял? Там всё написано по формат POST-запроса и про различные схемы кодирования. Это единственно верный и правильный источник данных для понимания сути. На всякий, для ознакомления с этим семейством RFC, волшебные слова для гугля есть "HTTP RFC".

Ооо, я давно мечтал с тобой познакомиться) Огромное количество ответов на вопросы людей и 0 полезной информации на массу) Думаешь я сам не знаю что нужно перечитывать все по HTTP? Только у меня нет столько времени и нахер не нужно, ради одной задачи) Именно поэтому я прошу исправить мой скрипт и указать на ошибку, и готов скинуть за это на хлебушек) А ты, хлебушек, пойми, если люди пишут сюда с простой и тупой проблемой, у них нет ни времени, ни желания перечитывать несколько томов по данной тематике, это все равно что учить китайский с нуля, вместо того чтобы зайти в переводчик  или спросить как переводиться одно слово.

NewAge747
Offline
Зарегистрирован: 28.05.2020

sadman41 пишет:
println() правильные вставляет терминаторы строк? Вроде в пакете \r\n должно итить, а println() может недокладывать \r. Послушайте компом с Wireshark - так надёжней, чем второй ардуиной. Мошт в IP-адресах запутались.

 

Спасибо, попробую  поиграться с \r и посмотреть че там приходит на комп

b707
Онлайн
Зарегистрирован: 26.05.2017

NewAge747 пишет:

А ты, хлебушек, пойми, если люди пишут сюда с простой и тупой проблемой, у них нет ни времени, ни желания перечитывать несколько томов по данной тематике

если у тебя "нет ни времени ни желания" разбираться со своей проблемой - почему это желание появится у кого-то еще?

Пиши в коммерческий раздел, плати деньгу - тебе все решат. А в форуме помогают. когда ты решаешь сам, а не делают за тебя.

sadman41
Offline
Зарегистрирован: 19.10.2016

Даже если бы оно было не wellformed, дамп бы виден был на второй еспшке. Он явно или не туда ломится или порт забыл открыть.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

NewAge747 пишет:

А ты, хлебушек, пойми, 

Я-то давно всё про тебя понял: то - что ты банальная тупая ленивая жопа, которая ищет причину, а не возможность. Времени у него нет, глядите-ка! Вместо того, чтобы тут истерить на форуме, пить дешёвое пойло и грызть семечки - займись делом, кусок недоразумения. Глядишь, и разовьёшься до уровня нижней ступени высших приматов, ещё не всё потеряно, надеюсь.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

sadman41 пишет:
Даже если бы оно было не wellformed, дамп бы виден был на второй еспшке. Он явно или не туда ломится или порт забыл открыть.

А тебя не смущает, что ТС пишет, что от той же ESP GET-запрос приходит? Имхо, дело таки в том, что там с форматом запроса - не айс. Впрочем, мне похер, я хлебушек, и читаю RFC.

sadman41
Offline
Зарегистрирован: 19.10.2016

Для меня первое - это коннект проверить. Поэтому я и советую на вайршарк ломанутся - сразу будет видно что почём. Вайршарк покажет, что в пакете не так.

vitalikost
Offline
Зарегистрирован: 28.11.2014
    
    Вот пример из как оправлять запрос, с рабочего проекта. 
String data = "param1=" + String(one_c1) +"&param2=" + 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);

 

 

vitalikost
Offline
Зарегистрирован: 28.11.2014

Строку 

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";