質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.48%

  • Arduino

    691questions

    Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

  • HTTPS

    318questions

    HTTPS(Hypertext Transfer Protocol Secure)はHypertext Transfer プロトコルとSSL/TLS プロトコルを組み合わせたものです。WebサーバとWebブラウザの間の通信を暗号化させて、通信経路上での盗聴や第三者によるなりすましを防止します。

  • GET

    102questions

    GETとはHTTPが対応するリクエストメソッドの一つです。クライアントからサーバーへ送られたURLパラメータのデータを取得する時必要がある時に使われます。

ArduinoでhttpsにGETリクエストを送りたい

受付中

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 891

Thomass

score 2

ArduinoからGASに対してGETリクエストを送ろうとしているのですがうまくいきません。
302が返ってきてしまいます。

またhttpsではなくhttpならできるかと思い、urlからsを取り除きましたがそれでもダメでした。

どこを直したら動くようになるのでしょうか?
教えて頂けるとありがたいです。
よろしくお願いいたします。

#include <M5Stack.h>
#include <WiFi.h>
#include <HTTPClient.h>

const char* ssid     = "----";   // your network SSID (name of wifi network)
const char* password = "----";    // your network password


// the setup routine runs once when M5Stack starts up
void setup(){

  // Initialize the M5Stack object
  M5.begin();
  //Initialize serial and wait for port to open:
  Serial.begin(115200);
  delay(100);

  M5.Lcd.print("Attempting to connect to SSID: ");
  WiFi.mode(WIFI_STA);
  WiFi.disconnect();
  M5.Lcd.println(ssid);
  WiFi.begin(ssid, password);

  // attempt to connect to Wifi network:
  while (WiFi.status() != WL_CONNECTED) {
    M5.Lcd.print(".");
    // wait 1 second for re-trying
    delay(1000);
  }

  M5.Lcd.print("Connected to ");
  M5.Lcd.println(ssid);

}

// the loop routine runs over and over again forever
void loop() {
  float distance1, distance2;

  //HTTPClient code start
  HTTPClient http;

  M5.Lcd.print("[HTTP] begin...\n");
  // configure traged server and url
  http.begin("https://script.google.com/macros/s/-------");

  M5.Lcd.print("[HTTP] GET...\n");
  // start connection and send HTTP header
  int httpCode = http.GET();
  M5.Lcd.println(httpCode);


  // httpCode will be negative on error
  if (httpCode > 0) {
    // file found at server
    if (httpCode == HTTP_CODE_OK) {
      String payload = http.getString();
      M5.Lcd.println(payload);
    } else {
    M5.Lcd.println("not success");
    }
  } else {
    M5.Lcd.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str());
  }

  M5.Lcd.println("finish");
  http.end();

  //delay 1 minutes
  delay(60000);
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+1

ArduinoからGASに対してGETリクエストを送ろうとしているのですがうまくいきません。302が返ってきてしまいます。

HTTPステータス302 ならリダイレクトなので正しいと考えられます。以下のようなHTTPレスポンスが返ってきているはずですが、クライアント(Arduino)側のプログラムは
Location: https://script.google.com/home?authuser ヘッダの内容に従って更にそちらへ GETメソッドまたはPOSTでリクエストを送信し、求めるレスポンスを受信していく必要があります。

  HTTP/1.1 302 Moved Temporarily
  Content-Type: text/html; charset=UTF-8
  Cache-Control: no-cache, no-store, max-age=0, must-revalidate
  Pragma: no-cache
  Expires: Mon, 01 Jan 1990 00:00:00 GMT
  Date: Mon, 17 Dec 2018 07:38:02 GMT
  Location: https://script.google.com/home?authuser
  X-Content-Type-Options: nosniff
  X-Frame-Options: SAMEORIGIN
  X-XSS-Protection: 1; mode=block
...たくさん続く


質問者さんがGETリクエストしているURLとは違いますが、例えばhttps://script.google.com/macros にwgetコマンドでGETリクエストすると、何度も302でリダイレクト扱いされます。/home?authuser 等となっているので、「ユーザー認証してからリクエスト」しろ、ってことでしょうね。

$ wget -4 https://script.google.com/macros

--2018-12-17 16:36:36--  https://script.google.com/macros
script.google.com (script.google.com) をDNSに問いあわせています... 172.217.161.78
script.google.com (script.google.com)|172.217.161.78|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 302 Moved Temporarily
場所: https://script.google.com/home?authuser [続く]
--2018-12-17 16:36:36--  https://script.google.com/home?authuser
script.google.com:443 への接続を再利用します。
HTTP による接続要求を送信しました、応答を待っています... 302 Found
場所: https://www.google.com/script/start/ [続く]
--2018-12-17 16:36:36--  https://www.google.com/script/start/
www.google.com (www.google.com) をDNSに問いあわせています... 216.58.196.228
www.google.com (www.google.com)|216.58.196.228|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 特定できません [text/html]
`macros.4' に保存中

     0K .......                                                2.91M=0.002s

2018-12-17 16:36:36 (2.91 MB/s) - `macros.4' へ保存終了 [7226]

またhttpsではなくhttpならできるかと思い、urlからsを取り除きましたがそれでもダメでした。

Googleのサイトのことですから、httpではダメでしょう。httpsでHTTPステータス302のリダイレクトに対応していく必要があります。あるいは最初から、リダイレクトされないようなHTTPリクエスト(恐らくPOSTメソッドで認証情報が完備しているもの)を送信すればHTTPステータス 200で返ってくるかもしれません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/12/17 17:45

    丁寧に説明していただきありがとうございます。

    ターミナル上で
    $ wget -4 https://script.google.com/macros/s/.../exec
    を行なったところ、200が返ってきました。
    これはユーザ認証ができていると考えて良いのでしょうか?

    そうするとhttpsのgetリクエストはしっかりできていて、M5Stackが受け取ったJSONファイルを処理できていないということになるのでしょうか?

    ちなみに302が表示されるのは
    M5.Lcd.println(httpCode);
    の部分でM5Stack上に表示されています。

    Arduinoの初心者なので間違っていることを言っていたら申し訳ありません。
    よろしくお願いいたします。

    キャンセル

  • 2018/12/17 18:12

    ターミナルで同じURLで試した場合には200 OKで返ってきて、M5Stackでは302が返ってくる場合、送出しているリクエストの内容(ヘッダー部分)とかが違っている可能性があります。リクエストの内容によってはクライアントの処理能力が示されるのでサーバーの挙動が変わる場合もありますので。またあるいは、httpsなのでサーバーとの鍵交換で問題があるか。(<この場合はそもそも通信できない気もしますが)

    > これはユーザ認証ができていると考えて良いのでしょうか?
    それは分からないです。認証が必要なページならそうですし、HTTPクライアントにもよります。

    > そうするとhttpsのgetリクエストはしっかりできていて、M5Stackが受け取ったJSONファイルを処理できていないということになるのでしょうか?

    JSONを処理するのは受信してからの処理だと思うので別の話になりますが、httpsのGET自体はできている、と言うことになります。また、302でも受信した内容を全て出力して確認すると、もしかすると必要なデータは受信できているかもしれません。(望み薄ですが。。。)

    キャンセル

  • 2018/12/23 14:17

    ウェブアプリケーションのURLにGETリクエストを送った結果が以下のようになりました。
    これはArduinoの問題なのでしょうか?それともGASの問題なのでしょうか?
    お分かりになれば教えていただきたいです。

    ’’’
    <HTML>
    <HEAD>
    <TITLE>Moved Temporarily</TITLE>
    </HEAD>
    <BODY BGCOLOR="#FFFFFF" TEXT="#000000">
    <H1>Moved Temporarily</H1>
    The document has moved <A HREF="https://script.googleusercontent.com/macros/echo?user_content_key=***; lib=***">here</A>.
    </BODY>
    </HTML>
    ’’’

    またHREFの値でGETリクエストを送ったところ、最初のウェブアプリケーションのURLが返ってきてしまい、ループのような状態になってしまいます。

    キャンセル

  • 2018/12/23 15:25

    サーバー側の都合で本当に受け付けない場合でも302が返ることがあるので、断言はできず、あくまで推測ですが、この場合GAS側は言うなれば「書類(リクエスト)不備ですね。こちらへどうぞ。」と別の窓口を案内しているような形です。なのでArduino側のリクエストが悪いと思います。同じURLで、WEBブラウザや別のクライアントプログラムで問題ないのであればやはりArduino側のプログラム(リクエストの中身)に問題があるといえます。ArduinoのHTTPClientの実装の詳細は分かりませんのでなんともいえませんが、httpsでやり取りする場合ヘッダーの内容に色々と付与されるケースもあるので、その辺の差かもしれません。

    キャンセル

0

M5Stack.hをインクルードしているということであれば、ESP32でしょうか?
であれば、WiFiClientSecureライブラリを利用すれば、httpsでサイトにアクセスできると思います。

以下を参照してみてください。

サンプルプログラム1

サンプルプログラム2

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.48%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Arduino

    691questions

    Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

  • HTTPS

    318questions

    HTTPS(Hypertext Transfer Protocol Secure)はHypertext Transfer プロトコルとSSL/TLS プロトコルを組み合わせたものです。WebサーバとWebブラウザの間の通信を暗号化させて、通信経路上での盗聴や第三者によるなりすましを防止します。

  • GET

    102questions

    GETとはHTTPが対応するリクエストメソッドの一つです。クライアントからサーバーへ送られたURLパラメータのデータを取得する時必要がある時に使われます。