私は Arduino IDE で ESP8266 を使用しており、ポート 200 でサーバーをセットアップしました。IP も 192.168.1.100 と同じように定義されています。
ESP8266WebServer server(200);
IPAddress ip(192, 168, 1, 100); //Node static IP
IPAddress gateway(192, 168, 1, 1);
IPAddress subnet(255, 255, 255, 0);
server.on("/parseIFTTT", parseIFTTT);
void parseIFTTT() {
String message;
message += server.args();
message += "\n";
for (uint8_t i = 0; i < server.args(); i++) {
message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
}
Serial.println(message);
Serial.println(server.argName(0));
Serial.println(server.arg(0));
server.send(200, "text/plain", "Success " + message);
}
parseIFTTT リクエストをこの parseIFTTT() メソッドにルーティングするために行われます。
ポート転送を行い、duckdns を使用して外部からこのサーバーにアクセスしました。これは私のダックDNSアドレスです
http://xxxxxx.duckdns.org:200/parseIFTTT
コンテンツ タイプが text/plain の POSTMAN ツールを使用して POST を作成すると、本文の内容がシリアル モニタに次のように表示されます。
plain
--body contents--
しかし、IFTTT から同じ要求が行われると、シリアル モニターには何も表示されません。最初は、問題は IFTTT にあると感じました。しかし、次のコードを使用して arduino で WiFiWebServer の例を使用するときのように、それは問題ではありません
String req = client.readString();
Serial.println(req);
client.flush();
IFTTT からのデータは次のように表示されます。
POST /parseIFTTT HTTP/1.1
Content-type: text/plain
host: xxxxxx.duckdns.org:200
content-length: 27
x-newrelic-id: XAMGV15QGwQJVllRDgQ=
x-newrelic-transaction: PxQFA1NbAQQJVwJWA1dSB0YdUFIOFQZOEgEPVA5ZBFYGXAwECFgFAFcUG0MHUwoLBAcDAxVs
Connection: close
{"value":"test data from IFTTT"}
だから私はserver.args()で何か間違ったことをしていると思います。contentType が text/plain であるか x-www-form-urlencoded であるかにかかわらず、server.args() は POST で使用される本文コンテンツを提供する必要があるという印象を受けています。
私は何か間違っているのですか、それとも server.args() で POST リクエストから本文データを取得できませんか?