ESP32 WIFI Web客户端返回400错误请求

时间:2018-08-17 22:38:13

标签: request webclient esp32

一直试图使此Web请求工作一段时间,但没有成功。

在浏览器上的同一请求也可以正常工作(从ESP32生成时从串行终端复制): caxiasmed.com/esp32/insert.php?jd=1234567&area=Area01&type=h&value=125 欢迎协助。 下面的代码。 谢谢 保罗

#include <WiFi.h>

const char* ssid     = "SkyNet";
const char* password = "ba21ca";
const char* host = "caxiasmed.com";

int    jd    = 1234567;
char  *area  = "Area01";
char   type  = 'h';
int    value = 125;

void setup(){
    Serial.begin(115200);

    // We start by connecting to a WiFi network
    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(){
    String  url;

    Serial.print("connecting to ");
    Serial.println(host);

    // Use WiFiClient class to create TCP connections
    WiFiClient client;
    const int httpPort = 80;
    if (!client.connect(host, httpPort)) {
        Serial.println("connection failed");
        return;
    } 
    url  = "/esp32/insert.php?";
    url += "jd=";            
    url += jd;
    url += "&area=";            
    url += area;
    url += "&type=";
    url += 'h';
    url += "&value=";
    url += value;

    Serial.print("Requesting URL: ");
    Serial.println(url);


    // This will send the request to the server
    client.print(String("GET ") + url + " HTTP/1.1\r\n" +
                 "Host: " + host + "\r\n" + "Connection: close\r\n\r\n");

/*
    Serial.println("#################################URL:");
    Serial.print("GET ");
    Serial.print(url);
    Serial.println(" HTTP/1.1");
    Serial.print("Host: ");
    Serial.println(host);
    Serial.println("Connection: close");
    Serial.println();
    Serial.println("#####################################");
*/                 
    unsigned long timeout = millis();
    while (client.available() == 0) {
        if (millis() - timeout > 5000) {
            Serial.println(">>> Client Timeout !");
            client.stop();
            return;
        }
    }

    // Read all the lines of the reply from server and print them to Serial
    while(client.available()) {
        String line = client.readStringUntil('\r');
        Serial.print(line);
    }

    Serial.println();
    Serial.println("closing connection");

    delay(15000);
}

当我在串行控制台上运行草图时,将获得WiFi连接的确认。 在脚本的以下部分执行后,在串行控制台中,我还获得了与“主机”的http连接成功的确认:

// This will send the request to the server
    client.print(String("GET ") + url + " HTTP/1.1\r\n" +
                 "Host: " + host + "\r\n" + "Connection: close\r\n\r\n");

发生错误,并且执行以下行时,Web服务器返回html格式的错误消息,该消息会打印在串行控制台上。

// Read all the lines of the reply from server and print them to Serial
while(client.available()) {
    String line = client.readStringUntil('\r');
    Serial.print(line);
}

此响应包括消息400 BAD REQUEST,好像上面的GET格式错误。

作为参考,我包括了先前发布的ESP32代码实际上调用的insert.php:

<?php

   include('connection.php');

   $jd    = $_GET['jd'];
   $area  = $_GET['area'];
   $type  = $_GET['type'];
   $value = $_GET['value'];

   $sql = "INSERT INTO activity (jd,area,type,value) VALUES (:jd,:area,:type,:value)";

   $stmt = $PDO->prepare($sql);

   $stmt->bindParam(':jd',$jd);
   $stmt->bindParam(':area',$area);
   $stmt->bindParam(':type',$type);
   $stmt->bindParam(':value',$value);

   if($stmt->execute()) {

      echo "Sucessful SQL Insertion";

   } else {
      echo "SQL Insert Failed.";
}
?>

正如我所说,如果我从监视正在运行的应用程序的串行终端屏幕复制GET请求行并将其粘贴到Web浏览器上,它将按照上述php代码成功地将数据插入SQL数据库中。

欢迎协助。 谢谢 保罗·博尔赫斯(Paulo Borges)

1 个答案:

答案 0 :(得分:0)

我遇到了同样的问题,在我的情况下,请求标头中缺少参数。如果您的浏览器中的请求成功,则可以执行以下操作:

  1. 下载能够创建TCP服务器的终端。我建议Hercules terminal;
  2. 在已知端口(例如8000)上创建TCP服务器;
  3. 在浏览器上发出请求,但使用主机“ localhost:8000”,然后查看终端中的内容。您将能够看到原始数据,这些原始数据与您必须通过ESP32发送的数据相同。

可能正在丢失您正在使用的服务器上需要发送的标头上的某些参数。尝试复制完整的请求,然后再删除不必要的参数。

以下是RAW请求的示例:

Request raw on terminal

让我们知道您是否能够解决问题。祝你好运!