2016-12-28 4 views
1

WifiESPライブラリ(https://github.com/bportaluri/WiFiEsp)を使用してRESTful POSTリクエストを作成しようとしています。私はcurlでリクエストを成功させることができましたが、ArduinoとESPを使って一貫してエラーが発生します。私は問題がライブラリが必要とするPOST要求の手動フォーマットに関係していると思われますが、間違ったことはありません。ここに私の消毒コード:WifiESPライブラリを使用したarduinoでのPOSTリクエスト

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

私の成功したカールの要求は次のようになります:

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

私が取得エラー(シリアルモニター経由で)これです、いくつかの実験をした後

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

カップルのもの。 'println'関数を使うとき、ライブラリは' \ n'の代わりに '\ r'と' \ n'の両方を追加することに気付きました。 '\ n'を手作業で行い、' print'関数を使ってください。そうでない場合は、シリアル全体に印刷し、カールポストのwiresharkトレースと比較してください。 – 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で説明したコードが正しい、.Iは、サーバーにデータを投稿中にエラーがこの行が原因だと思う働いて 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 

に接続され、このエラー に来

これは、あなたがそれを無視することができ、ライブラリのエラーです。

関連する問題