Как сделать правильный POST с запросом клиента http на ESP32 (ошибка: «DNS Failed for sitename») - PullRequest
0 голосов
/ 21 апреля 2020

Я пытаюсь отправить запрос POST на сайт, который я настроил, используя ESP32, содержащий 2 фрагмента данных. Я пытался использовать сайт "reqbin.com" для отправки запроса POST, содержащего те же данные, поэтому я не думаю, что проблема заключается в самих данных.

Ниже мой код:

char ssid[] = "{{name}}";
char pass[] = "{{pass}}";
int port = 8080;
WiFiClient wifi;

void setup()
{
delay(1000);
    WiFi.mode(WIFI_OFF); //Prevents reconnection issue (taking too long to connect)
    delay(1000);
    WiFi.mode(WIFI_STA); //This line hides the viewing of ESP as wifi hotspot

    WiFi.begin(ssid, pass); //Connect to your WiFi router
    Serial.println("");

    Serial.print("Connecting");
    // Wait for connection
    while (WiFi.status() != WL_CONNECTED)
    {
        delay(500);
        Serial.print(".");
    }

    //If connection successful show IP address in serial monitor
    Serial.println("");
    Serial.print("Connected to ");
    Serial.println(ssid);
    Serial.print("IP address: ");
    Serial.println(WiFi.localIP());
}

void loop()
{
String serverAddress = "sitename.com/data.php";
    String contentType = "text/plain"
    String postData = "t=26.1 h=25.6";
    HttpClient http = HttpClient(wifi, serverAddress, port);
    http.beginRequest(); //Specify request destination
    int httpCode = http.post("/", contentType, postData);
    Serial.println("httpCode = " + httpCode);
    if (httpCode > 0)
    {
        String response = http.responseBody();
        Serial.println("httpCode === " + httpCode);
        Serial.println(response);
    }
    else
    {
        Serial.println("Error on POST request");
        Serial.println(httpCode);
    }
    http.endRequest();
}

При использовании reqbin я получаю статус 200, и сайт возвращается. Тем не менее, на ESP32, он возвращает ошибку:

[E][WiFiGeneric.cpp:654] hostByName(): DNS Failed for sitename.com/data.php

Я не уверен, что синтаксис моего запроса неверен.


ОБНОВЛЕНИЕ: изменил мой l oop и изменил адрес сервера следующим образом:

String serverAddress = "sitename.com";
    String contentType = "text/plain";
    String postData = "t=26.1 h=25.6";
    HttpClient http = HttpClient(wifi, serverAddress, port);
    http.beginRequest(); //Specify request destination
    int httpCode = http.post("/data.php", contentType, postData);
    Serial.println("httpCode = " + httpCode);

Теперь появляется ошибка:

socket error on fd 57, errno: 104, "Connection reset by peer"

Редактировать для Codebreaker:

String serverAddress = "sitename.com";
HttpClient http = HttpClient(wifi, serverAddress, port);
String response;
int statusCode = 0;

Setup has stayed the same.

void loop()
{
String contentType = "application/x-www-form-urlencoded";
    // String postData = temp + " " + humid;
    String postData = "?t=26.1&h=25.6";
    http.post("/data.php", contentType, postData);
    // read the status code and body of the response
    statusCode = http.responseStatusCode();
    response = http.responseBody();

    Serial.print("Status code: ");
    Serial.println(statusCode);
    Serial.print("Response: ");
    Serial.println(response);
}

1 Ответ

1 голос
/ 21 апреля 2020

Я предполагаю, что сервер ожидает данные в кодировке URL, а не текстовый файл. Поэтому попробуйте определить следующее перед установкой ()

 int port = 80;
 String response;
int statusCode = 0;

String serverAddress = "sitename.com";
HttpClient http = HttpClient(wifi, serverAddress, port);

И в своем l oop вы строите пост следующим образом

String contentType = "application/x-www-form-urlencoded";
String postData = "?t=26.1&h=25.6";
http.post("/data.php", contentType, postData);

и затем читаете ответ

  // read the status code and body of the response
  statusCode = http.responseStatusCode();
  response = http.responseBody();

  Serial.print("Status code: ");
  Serial.println(statusCode);
  Serial.print("Response: ");
  Serial.println(response);

Если это работает, замените класс String на массивы символов, подобные этому

char serverAddress[] = "www.test.com";  // server address
...