一直试图使此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)
答案 0 :(得分:0)
我遇到了同样的问题,在我的情况下,请求标头中缺少参数。如果您的浏览器中的请求成功,则可以执行以下操作:
可能正在丢失您正在使用的服务器上需要发送的标头上的某些参数。尝试复制完整的请求,然后再删除不必要的参数。
以下是RAW请求的示例:
让我们知道您是否能够解决问题。祝你好运!