web-dev-qa-db-ja.com

Arduinoを使用してhttp POSTリクエストを行う

私が作成してホストしたWebプロジェクトのAPIに情報を投稿しようとしています。 HTTP POSTリクエストの正確な形式が何であるかわかりません。試行するたびに、「無効な動詞」があるというメッセージでHTTP 400エラーが発生します。

サンプルコード:

byte server[] = {"our IP"}
..
..

client(server, 80)
..
..
client.println("POST /Api/AddParking/3");

問題なく提供されたIPアドレスに接続しますが、上記のHTTPエラーコード400が返されます。POSTの後にHTTPバージョンを含めるかどうかはわかりませんまたは、Content-Lengthまたはその他の情報。

18
Austen Bryan

元の質問はすでに回答されていますが、Google経由で通り過ぎる人々のための参照用です。以下は、Arduinoを使用してWebサーバーにデータを投稿する方法のより完全な例です。

IPAddress server(10,0,0,138);
String PostData = "someDataToPost";

if (client.connect(server, 80)) {
  client.println("POST /Api/AddParking/3 HTTP/1.1");
  client.println("Host: 10.0.0.138");
  client.println("User-Agent: Arduino/1.0");
  client.println("Connection: close");
  client.print("Content-Length: ");
  client.println(PostData.length());
  client.println();
  client.println(PostData);
}
30
stif

手作りのHTTPパケットの送信は、使用される形式に非常にうるさいため、少し注意が必要です。必要な構文とフィールドについて説明しているので、時間があれば、 HTTPプロトコル を読むことを強くお勧めします。特に、セクション5「リクエスト」をご覧ください。

コードに関しては、POST URIの後にHTTPバージョンを指定する必要があります。また、 "Host"ヘッダーも指定する必要があると思います。その上で、各行の終わりに復帰改行(CRLF)を付けるには、パケットは次のようになります。

POST /Api/AddParking/3 HTTP/1.1
Host: www.yourhost.com
2
Dean Pucsek

リクエストもそのように送信できます

 // Check if we are Connected.
 if(WiFi.status()== WL_CONNECTED){   //Check WiFi connection status
    HTTPClient http;    //Declare object of class HTTPClient

    http.begin("http://useotools.com/");      //Specify request destination
    http.addHeader("Content-Type", "application/x-www-form-urlencoded", false, true);
    int httpCode = http.POST("type=get_desire_data&"); //Send the request

    Serial.println(httpCode);   //Print HTTP return code
    http.writeToStream(&Serial);  // Print the response body

}
0
user889030

別のオプションは、HTTPClient.hを使用することです(adauuitのESP32フェザーのarduino IDE)の場合)、httpsを簡単に処理しているようです。JSONペイロードも含めており、IFTTTを正常に送信できますWebhook。

  HTTPClient http;
  String url="https://<IPaddress>/testurl";
  String jsondata=(<properly escaped json data here>);

  http.begin(url); 
  http.addHeader("Content-Type", "Content-Type: application/json"); 

  int httpResponseCode = http.POST(jsondata); //Send the actual POST request

  if(httpResponseCode>0){
    String response = http.getString();  //Get the response to the request
    Serial.println(httpResponseCode);   //Print return code
    Serial.println(response);           //Print request answer
  } else {
    Serial.print("Error on sending POST: ");
    Serial.println(httpResponseCode);

    http.end();

 }
0
jshep321