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

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

新規登録して質問してみよう
ただいま回答率
85.37%
GET

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

HTTPS

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

Arduino

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

Q&A

2回答

14393閲覧

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

Thomass

総合スコア12

GET

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

HTTPS

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

Arduino

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

0グッド

0クリップ

投稿2018/12/17 06:17

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); }

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

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

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

PlainText

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

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

bash

1$ wget -4 https://script.google.com/macros 2 3--2018-12-17 16:36:36-- https://script.google.com/macros 4script.google.com (script.google.com) をDNSに問いあわせています... 172.217.161.78 5script.google.com (script.google.com)|172.217.161.78|:443 に接続しています... 接続しました。 6HTTP による接続要求を送信しました、応答を待っています... 302 Moved Temporarily 7場所: https://script.google.com/home?authuser [続く] 8--2018-12-17 16:36:36-- https://script.google.com/home?authuser 9script.google.com:443 への接続を再利用します。 10HTTP による接続要求を送信しました、応答を待っています... 302 Found 11場所: https://www.google.com/script/start/ [続く] 12--2018-12-17 16:36:36-- https://www.google.com/script/start/ 13www.google.com (www.google.com) をDNSに問いあわせています... 216.58.196.228 14www.google.com (www.google.com)|216.58.196.228|:443 に接続しています... 接続しました。 15HTTP による接続要求を送信しました、応答を待っています... 200 OK 16長さ: 特定できません [text/html] 17`macros.4' に保存中 18 19 0K ....... 2.91M=0.002s 20 212018-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 07:59

dodox86

総合スコア9254

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Thomass

2018/12/17 08:45

丁寧に説明していただきありがとうございます。 ターミナル上で $ wget -4 https://script.google.com/macros/s/.../exec を行なったところ、200が返ってきました。 これはユーザ認証ができていると考えて良いのでしょうか? そうするとhttpsのgetリクエストはしっかりできていて、M5Stackが受け取ったJSONファイルを処理できていないということになるのでしょうか? ちなみに302が表示されるのは M5.Lcd.println(httpCode); の部分でM5Stack上に表示されています。 Arduinoの初心者なので間違っていることを言っていたら申し訳ありません。 よろしくお願いいたします。
dodox86

2018/12/17 09:12

ターミナルで同じURLで試した場合には200 OKで返ってきて、M5Stackでは302が返ってくる場合、送出しているリクエストの内容(ヘッダー部分)とかが違っている可能性があります。リクエストの内容によってはクライアントの処理能力が示されるのでサーバーの挙動が変わる場合もありますので。またあるいは、httpsなのでサーバーとの鍵交換で問題があるか。(<この場合はそもそも通信できない気もしますが) > これはユーザ認証ができていると考えて良いのでしょうか? それは分からないです。認証が必要なページならそうですし、HTTPクライアントにもよります。 > そうするとhttpsのgetリクエストはしっかりできていて、M5Stackが受け取ったJSONファイルを処理できていないということになるのでしょうか? JSONを処理するのは受信してからの処理だと思うので別の話になりますが、httpsのGET自体はできている、と言うことになります。また、302でも受信した内容を全て出力して確認すると、もしかすると必要なデータは受信できているかもしれません。(望み薄ですが。。。)
Thomass

2018/12/23 05: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が返ってきてしまい、ループのような状態になってしまいます。
dodox86

2018/12/23 06:25

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

0

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

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

サンプルプログラム1

サンプルプログラム2

投稿2018/12/18 10:23

編集2018/12/23 08:03
mkgt00

総合スコア165

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問