NefryからPOSTリクエストを送る

きっかけ

IoT工作をしていて、センサからの値が基準を超えたらLINE botを通じてPushメッセージを送りたくなった。 メッセージの中身は固定にした。

コード

#include <WiFiClientSecure.h>
WiFiClientSecure client;

const int HTTP_PORT = 443;
const char* HOST = "api.line.me";
String url = "/v2/bot/message/push";

String pushMessage(){
   Nefry.print("connecting to ");
   Nefry.println(HOST);

   if (!client.connect(HOST, HTTP_PORT)) {
     Nefry.println("connection failed");
     return "connection failed";
   }

  String json = R"({ "to": "UUID","messages": [{"type": "text","text": "Hello, world!"}]})";
  String auth = R"(Authorization: Bearer YOUR_TOKEN)";

    client.println("POST " + url + " HTTP/1.1");
    client.println("Host: " + String(HOST));
    client.println("Content-Type: application/json");
    client.println("Connection: Keep-Alive");
    client.println("Content-Length: "+ String(json.length()));
    client.println(auth);
    client.println("");
    client.println(json);
    client.println();

   unsigned long timeout = millis();
   while (client.available() == 0) {
     if (millis() - timeout > 5000) {
         Nefry.println(">>> Client Timeout !");
         client.stop();
         return  "Client Timeout" ;
     }
   }

    String line = "";
   while(client.available()) {
       line = client.readStringUntil('\r');
       Nefry.print(line);
   }

   Nefry.println("closing connection");

   return line;
}

ハマりどころ

Raw文字列を使う

String json = '{\"to\":\"UUID\",\"messages\"[{\"type\":\"text\",\"text\":\"Hello, World!\"}]}'; としていたがうまく送れなかったためRaw文字列を使った。

Raw文字列

R"()"で囲った中の文字列はエスケープしなくてもよいというもの参考−生文字リテラル

あとがき

curlのログを見てそのとおりに一行ずつ出力してやれば動いた。 HTTPリクエストの理解が進んだ。

参考

[Web] HTTPリクエストの中身を学んでみた。GETやPOSTの違いなど HTTP通信でリクエストを投げる HTTPとPOSTとGET