arrow-right hamburger logo-mark social-facebook social-github social-twitter

HTTP通信でリクエストを投げる

HTTP POST using Nefry BT

このページではNefry BTでHTTP POSTリクエストを扱うサンプルや記事を紹介します。

Nefry BTでシンプルなHTTP POSTリクエスト

HipChatのルームにPOSTするサンプルです。他のAPIでも応用できます。

curlでリクエスト送るとこんな感じです。

curl -d '{"color":"green","message":"test","notify":false,"message_format":"text"}' -H 'Content-Type: application/json' https://xxxxxx.hipchat.com/v2/room/4651875/notification?auth_token=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

これをNefry BTで試してみましょう。 5秒に1回POSTするプログラムです。

#include <WiFiClientSecure.h>
WiFiClientSecure client;

const int HTTP_PORT = 443;
const char* HOST = "xxxxxx.hipchat.com";

void setup() {}

void loop() {
  String url = "/v2/room/4651875/notification?auth_token=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
  url += "&color=green&message=test&notify=false&message_format=text";

  Serial.print("connecting to ");
  Serial.println(HOST);

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

  client.println("POST " + url + " HTTP/1.1");
  client.println("Content-Type: application/json");
  client.println("Content-Type: application/x-www-form-urlencoded");
  client.println("Host: " + String(HOST));
  client.println("Connection: close");
  client.println();

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

  // Read all the lines of the reply from server and print them to Serial
  while(client.available()) {
      String line = client.readStringUntil('\r');
      Serial.print(line);
  }

  Serial.println();
  Serial.println("closing connection");

  delay(5000);
}

実行結果はこんな感じです。

リクエストの要素にスペースや記号などが入る場合

例えば「My first notification (yey)」というメッセージを送りたい場合、スペースが入っていてURLのパラメータがうまく動いてくれない場合があります。

この場合はデフォルトプログラムのコードにもありますが、URLをエンコードする必要があります。

StrPerEncordescapeParameterの関数でエンコードしています。

#include <WiFiClientSecure.h>
WiFiClientSecure client;

String StrPerEncord(const char* c_str);
String escapeParameter(String param);
const int HTTP_PORT = 443;
const char* HOST = "xxxxxx.hipchat.com";

void setup() {}

void loop() {
  String url = "/v2/room/4651875/notification?auth_token=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
  url += "&color=green&notify=false&message_format=text&message=";
  url += StrPerEncord(escapeParameter("My first notification (yey)").c_str());

  Serial.print("connecting to ");
  Serial.println(HOST);

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

  client.println("POST " + url + " HTTP/1.1");
  client.println("Content-Type: application/json");
  client.println("Content-Type: application/x-www-form-urlencoded");
  client.println("Host: " + String(HOST));
  client.println("Connection: close");
  client.println();

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

  // Read all the lines of the reply from server and print them to Serial
  while(client.available()) {
      String line = client.readStringUntil('\r');
      Serial.print(line);
  }

  Serial.println();
  Serial.println("closing connection");

  delay(5000);
}

String StrPerEncord(const char* c_str) {
  uint16_t i = 0;
  String str_ret = "";
  char c1[3], c2[3], c3[3];

  while (c_str[i] != '\0') {
    if (c_str[i] >= 0xC2 && c_str[i] <= 0xD1) { //2バイト文字
      sprintf(c1, "%2x", c_str[i]);
      sprintf(c2, "%2x", c_str[i + 1]);
      str_ret += "%" + String(c1) + "%" + String(c2);
      i = i + 2;
    } else if (c_str[i] >= 0xE2 && c_str[i] <= 0xEF) {
      sprintf(c1, "%2x", c_str[i]);
      sprintf(c2, "%2x", c_str[i + 1]);
      sprintf(c3, "%2x", c_str[i + 2]);
      str_ret += "%" + String(c1) + "%" + String(c2) + "%" + String(c3);
      i = i + 3;
    } else {
      str_ret += String(c_str[i]);
      i++;
    }
  }
  return str_ret;
}

String escapeParameter(String param) {
  param.replace("%", "%25");
  param.replace("+", "%2B");
  param.replace(" ", "+");
  param.replace("\"", "%22");
  param.replace("#", "%23");
  param.replace("$", "%24");
  param.replace("&", "%26");
  param.replace("'", "%27");
  param.replace("(", "%28");
  param.replace(")", "%29");
  param.replace("*", "%2A");
  param.replace(",", "%2C");
  param.replace("/", "%2F");
  param.replace(":", "%3A");
  param.replace(";", "%3B");
  param.replace("<", "%3C");
  param.replace("=", "%3D");
  param.replace(">", "%3E");
  param.replace("?", "%3F");
  param.replace("@", "%40");
  param.replace("[", "%5B");
  param.replace("\\", "%5C");
  param.replace("]", "%5D");
  param.replace("^", "%5E");
  param.replace("'", "%60");
  param.replace("{", "%7B");
  param.replace("|", "%7C");
  param.replace("}", "%7D");
  return param;
}

Last edited on 2018.07.04 by のびすけ

HTTP通信でリクエストを投げる

HTTP POST using Nefry BT

このページではNefry BTでHTTP POSTリクエストを扱うサンプルや記事を紹介します。

Nefry BTでシンプルなHTTP POSTリクエスト

HipChatのルームにPOSTするサンプルです。他のAPIでも応用できます。

curlでリクエスト送るとこんな感じです。

curl -d '{"color":"green","message":"test","notify":false,"message_format":"text"}' -H 'Content-Type: application/json' https://xxxxxx.hipchat.com/v2/room/4651875/notification?auth_token=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

これをNefry BTで試してみましょう。 5秒に1回POSTするプログラムです。

#include <WiFiClientSecure.h>
WiFiClientSecure client;

const int HTTP_PORT = 443;
const char* HOST = "xxxxxx.hipchat.com";

void setup() {}

void loop() {
  String url = "/v2/room/4651875/notification?auth_token=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
  url += "&color=green&message=test&notify=false&message_format=text";

  Serial.print("connecting to ");
  Serial.println(HOST);

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

  client.println("POST " + url + " HTTP/1.1");
  client.println("Content-Type: application/json");
  client.println("Content-Type: application/x-www-form-urlencoded");
  client.println("Host: " + String(HOST));
  client.println("Connection: close");
  client.println();

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

  // Read all the lines of the reply from server and print them to Serial
  while(client.available()) {
      String line = client.readStringUntil('\r');
      Serial.print(line);
  }

  Serial.println();
  Serial.println("closing connection");

  delay(5000);
}

実行結果はこんな感じです。

リクエストの要素にスペースや記号などが入る場合

例えば「My first notification (yey)」というメッセージを送りたい場合、スペースが入っていてURLのパラメータがうまく動いてくれない場合があります。

この場合はデフォルトプログラムのコードにもありますが、URLをエンコードする必要があります。

StrPerEncordescapeParameterの関数でエンコードしています。

#include <WiFiClientSecure.h>
WiFiClientSecure client;

String StrPerEncord(const char* c_str);
String escapeParameter(String param);
const int HTTP_PORT = 443;
const char* HOST = "xxxxxx.hipchat.com";

void setup() {}

void loop() {
  String url = "/v2/room/4651875/notification?auth_token=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
  url += "&color=green&notify=false&message_format=text&message=";
  url += StrPerEncord(escapeParameter("My first notification (yey)").c_str());

  Serial.print("connecting to ");
  Serial.println(HOST);

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

  client.println("POST " + url + " HTTP/1.1");
  client.println("Content-Type: application/json");
  client.println("Content-Type: application/x-www-form-urlencoded");
  client.println("Host: " + String(HOST));
  client.println("Connection: close");
  client.println();

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

  // Read all the lines of the reply from server and print them to Serial
  while(client.available()) {
      String line = client.readStringUntil('\r');
      Serial.print(line);
  }

  Serial.println();
  Serial.println("closing connection");

  delay(5000);
}

String StrPerEncord(const char* c_str) {
  uint16_t i = 0;
  String str_ret = "";
  char c1[3], c2[3], c3[3];

  while (c_str[i] != '\0') {
    if (c_str[i] >= 0xC2 && c_str[i] <= 0xD1) { //2バイト文字
      sprintf(c1, "%2x", c_str[i]);
      sprintf(c2, "%2x", c_str[i + 1]);
      str_ret += "%" + String(c1) + "%" + String(c2);
      i = i + 2;
    } else if (c_str[i] >= 0xE2 && c_str[i] <= 0xEF) {
      sprintf(c1, "%2x", c_str[i]);
      sprintf(c2, "%2x", c_str[i + 1]);
      sprintf(c3, "%2x", c_str[i + 2]);
      str_ret += "%" + String(c1) + "%" + String(c2) + "%" + String(c3);
      i = i + 3;
    } else {
      str_ret += String(c_str[i]);
      i++;
    }
  }
  return str_ret;
}

String escapeParameter(String param) {
  param.replace("%", "%25");
  param.replace("+", "%2B");
  param.replace(" ", "+");
  param.replace("\"", "%22");
  param.replace("#", "%23");
  param.replace("$", "%24");
  param.replace("&", "%26");
  param.replace("'", "%27");
  param.replace("(", "%28");
  param.replace(")", "%29");
  param.replace("*", "%2A");
  param.replace(",", "%2C");
  param.replace("/", "%2F");
  param.replace(":", "%3A");
  param.replace(";", "%3B");
  param.replace("<", "%3C");
  param.replace("=", "%3D");
  param.replace(">", "%3E");
  param.replace("?", "%3F");
  param.replace("@", "%40");
  param.replace("[", "%5B");
  param.replace("\\", "%5C");
  param.replace("]", "%5D");
  param.replace("^", "%5E");
  param.replace("'", "%60");
  param.replace("{", "%7B");
  param.replace("|", "%7C");
  param.replace("}", "%7D");
  return param;
}

Last edited on 2018.07.04

by のびすけ

Nefrybt-index-