2016-12-28 2 views
1

Ich versuche, RESTful POST-Anfrage mithilfe der WifiESP-Bibliothek (https://github.com/bportaluri/WiFiEsp) zu machen. Ich bin in der Lage, die Anfrage mit curl erfolgreich zu machen, aber immer einen Fehler mit dem Arduino und ESP bekommen. Ich vermute, das Problem hängt mit der manuellen Formatierung der POST-Anfrage zusammen, die die Bibliothek benötigt, aber ich sehe nichts falsch. Hier ist mein hygienisiert Code:POST-Anfrage auf arduino mit ESP8266 mit WifiESP-Bibliothek

if (client.connect(server, 80)) { 
Serial.println("Connected to server"); 
// Make a HTTP request 
String content = "{'JSON_key': 2.5}"; // some arbitrary JSON 
client.println("POST /some/uri HTTP/1.1"); 
client.println("Host: http://things.ubidots.com"); 
client.println("Accept: */*"); 
client.println("Content-Length: " + sizeof(content)); 
client.println("Content-Type: application/json"); 
client.println(); 
client.println(content); 
} 

Der Fehler I (über serielle Monitor) erhalten ist dies:

Connected to server 
[WiFiEsp] Data packet send error (2) 
[WiFiEsp] Failed to write to socket 3 
[WiFiEsp] Disconnecting 3 

Meine erfolgreiche curl Anfragen sieht wie folgt aus:

curl -X POST -H "Content-Type: application/json" -d 'Some JSON' http://things.ubidots.com/some/uri 
+0

Paar Dinge. Mir ist aufgefallen, dass die Bibliothek sowohl '\ r' als auch' \ n' anhängt, anstatt nur '\ n', wenn Sie die Funktion' println' verwenden. Versuchen Sie die '\ n's manuell und verwenden Sie' print' Funktion. Wenn das nicht klappt, drucken Sie das Ganze auf Serial und vergleichen Sie es mit einer Wireshark-Spur Ihres Curl-Posts. – leetibbett

+0

@leetibett Danke für die Antwort. '\ r \ n \ 'war schließlich kein Problem, aber es brachte mich dazu, die Dokumentation des HTTP-Protokolls zu betrachten, was mir half, mehrere andere Probleme zu finden. –

Antwort

1

Nach einigen Experimenten, Hier ist die Lösung für die mehrere Probleme.

  1. Das JSON-Objekt wurde nicht korrekt formatiert. Einfache Anführungszeichen wurden nicht akzeptiert, daher musste ich den Anführungszeichen entgehen.
  2. Der Host benötigt in einer POST-Anfrage nicht "http: //"; POST ist eine HTTP-Methode.
  3. Die Methode sizeof() gibt die Größe (in Byte) der Variablen im Speicher und nicht die Länge der Zeichenfolge zurück. Es muss durch .length() ersetzt werden.
  4. Das Anhängen einer Ganzzahl an eine Zeichenfolge erfordert eine Umwandlung.

Dies ist der korrigierte Code:

if (client.connect(server, 80)) { 
    Serial.println("Connected to server"); 
    // Make the HTTP request 
    int value = 2.5; // an arbitrary value for testing 
    String content = "{\"JSON_key\": " + String(value) + "}"; 
    client.println("POST /some/uri HTTP/1.1"); 
    client.println("Host: things.ubidots.com"); 
    client.println("Accept: */*"); 
    client.println("Content-Length: " + String(content.length())); 
    client.println("Content-Type: application/json"); 
    client.println(); 
    client.println(content); 
} 
1

Der Code von Troy D erklärt ist richtig und es funktioniert .Ich denke, der Fehler, die Daten an den Server in der Veröffentlichung auf dieser Linie zurückzuführen ist client.println ("Inhaltslänge:" + sizeof (Inhalt)); und der richtige Weg ist
client.println ("Content-Length:" + String (content.length()));

kommt nun auf diesen Fehler Verbunden mit Server

[WiFiEsp] Data packet send error (2) 
[WiFiEsp] Failed to write to socket 3 
[WiFiEsp] Disconnecting 3 

Dies ist der Fehler der Bibliothek ist, dass Sie es ignorieren können.

Verwandte Themen