2016-12-28 326 views
1

我試圖使用WifiESP庫(https://github.com/bportaluri/WiFiEsp)發出RESTful POST請求。我能夠用curl成功地完成請求,但使用Arduino和ESP始終會出現錯誤。我懷疑這個問題與庫所需的POST請求的手動格式有關,但我沒有看到任何錯誤。在這裏我消毒代碼:使用WifiESP庫,使用ESP8266在arduino上發出POST請求

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); 
} 

我得到的錯誤(通過串行監視器)是這樣的:

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

我的成功捲曲的請求是這樣的:

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

夫婦的事情。我注意到,當你使用'println'函數時,庫附加'\ r'和'\ n'而不是'\ n'。嘗試手動操作'\ n's並使用'print'功能。如果不這樣做,請將整個內容打印到Serial上,並將其與捲曲文章的wireshark trace進行比較。 – leetibbett

+0

@leetibbett感謝您的回覆。 '\ r \ n'最終不是問題,但它確實讓我看到了HTTP協議文檔,這幫助我找到了其他幾個問題。 –

回答

1

一些試驗後,這裏是多個問題的解決方案。

  1. JSON對象格式不正確。單引號不被接受,所以我需要避開雙引號。
  2. 主機在POST請求中不需要「http://」 POST是一種HTTP方法。
  3. sizeof()方法返回內存中變量的大小(以字節爲單位),而不是字符串的長度。它需要被.length()替換。
  4. 將整數附加到字符串需要強制轉換。

這是糾正代碼:

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

特洛伊d解釋的代碼是正確的,它的工作。我認爲,在數據發送到服務器的錯誤是由於該行 client.println(「Content-Length:」+ sizeof(content)); 正確的方法是
client.println(「Content-Length:」+ String(content.length()));

現在來到這個錯誤 器連接到服務器

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

這是圖書館的錯誤,您可以忽略它。