簡體   English   中英

如何解決400錯誤的請求

[英]How do I troubleshoot a 400 Bad Request

我正在運行一個程序,該程序使用對PHP頁面的POST請求向服務器報告有關泵運行時間和安培的數據。 該系統在多個Arduino Pro Mini上運行良好。 我正在使用328和Arduino Uno引導程序構建的板上進行測試,並且在4個不同的POST請求中,兩個工作失敗,兩個失敗。

我相信這是由於Arduino的POST請求格式不正確引起的,但是由於Arduino Serial.prints正確的字符串,因此我無法進行驗證。 如果我手動對字符串進行硬編碼,它也可以工作。

我以這種方式形成數據:

byte runtime = analogRead(A3); // generates random data
float amps = analogRead(A2) / 100;
char cruntime[4]; // create char array for runtime
char camps[5];
dtostrf(runtime, 4, 0, cruntime);
dtostrf(amps, 2, 1, camps);
String sruntime = String(cruntime);
sruntime.trim();
String samps = String(camps);
samps.trim();
String cwpdata = "serial=test&runtime=" + sruntime + "&amps=" + samps; // posted to server

我已經檢查我的服務器是否有錯誤,但是找不到這些記錄。 無論如何,我每次都能看到正在發布的內容,因此我可以看到請求的格式不正確嗎?

這是Arduino中用於發布數據的代碼:

void postData(String inputData, String filename) {
  if (client.connect(server, 80)) {
    Serial.println("connected");
    // Make a HTTP request:
    client.println("POST /dev/telemetry/test/" + filename + ".php HTTP/1.1");
    client.println("Host: www.SERVER.com"); // changed for privacy
    client.println("Content-Type: application/x-www-form-urlencoded");
    client.print("Content-Length: "); 
    client.println(inputData.length()); 
    Serial.println(inputData);
    Serial.print("Data Length: ");
    Serial.println(inputData.length());
    client.println("Connection: close");
    client.println(); 
    client.println(inputData);
    client.println();
  } // close if client

  wdt_reset();
  unsigned long startMillis = millis();
  unsigned long endMillis = startMillis + timeout;
  while(client.connected() && (millis() < endMillis)) {
    wdt_reset();
    while(client.available()) {
      char ch = client.read();
      Serial.print(ch);
      wdt_reset();
    } 
  }
  // if the server's disconnected, stop the client:
  Serial.println();
  client.stop();
  int memory = freeMemory();
  if (memory < 125) {
    delay(15000);
  }
}

我可能會猜測,有時候,您的inputData包含未轉義的字符,這些字符在POST正文中發送之前未正確編碼。

"serial=test&runtime=" + sruntime + "&amps=" + samps ,如果sruntimesamps包含未轉義的字符,則很可能會拋出服務器端的解析。 是否有任何“不可打印的”控制字節隱藏在Serial.println(inputData) ,可能被忽略了?

順便說一下,“安全”字符是AZ,az,0-9,破折號,下划線,點,代字號和加號(表示空格)。 其他所有內容在發送之前都必須進行百分比編碼 如果數據碰巧是Unicode,它將變得更加毛茸茸

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM