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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

1回答

2696閲覧

GASで外部APIに対しFORM形式のテキストデータをPOST送信したい

demut

総合スコア2

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

1クリップ

投稿2020/06/07 06:01

編集2020/06/07 08:28

Postmanの送信データ

前提・実現したいこと

Google Apps Scriptで外部APIに対しform-dataでデータを渡したい。

発生している問題・エラーメッセージ

<<Google Apps Scriptのログで確認>> Exception: https://api.uhooinc.com のリクエストに失敗しました(エラー: 401)。サーバー応答の一部: {"status":2,"message":"Invalid Input"}

該当のソースコード

Google

1var vFormData; 2var vSendData; 3var vRcvData; 4var vAPIURL = 'https://www.test.net/testapi'; 5 6//フォームデータ生成 7vFormData = { 8 "username":"TEST-USER", 9 "password":"abcd@1234", 10 "senddata1":"test1", 11 "senddata2":"test2" 12}; 13 14//API送信用データ生成 15vSendData = { 16 "method":"POST", 17 "body":vFormData 18}; 19![イメージ説明](846492060943ce000a5abac0eb39f0da.jpeg) 20//API送信 21vRcvData = JSON.parse(UrlFetchApp.fetch(vAPIURL, vSendData).GetContentText()); 22

試したこと

ソースコード17行目の"body"を"payload"等に変更、"contentType"に"application/json"を指定したがエラーは変わらず。

concole.logでvSendDataの中身を確認したところ、データは想定通りである。

APIのデータ送信ツール「Postman」において、以下の情報を送信したところ、Status 200 OKが返ってきて意図したデータを受信できている。
(※詳細は添付画像参照)
■Postmanで送信したデータ
Method: POST
URL: https://www.test.net/testapi
Body: form-data
KEY:username,password,senddata1,senddata2

補足情報(FW/ツールのバージョンなど)

外部APIへJSON形式でデータを送信したスクリプトでpayloadを指定し問題なく動作していた別のスクリプトを流用しているため、送信するデータ形式に問題があるのではないか?と疑っている。
自分で調べ、画像やPDFデータなどをPOSTする情報は見つかったが、それを参考にvFormData、vSendDataを修正するも、出力されるエラーは変わらず。

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

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

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

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

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

guest

回答1

0

ベストアンサー

ContentType を省略すると、application/x-www-form-urlencodedになるようなので、multipart/form-dataを明示してみるとどうでしょうか。
あと、UrlFetchApp.fetch()の第2引数のオブジェクトのキーに "body" は指定できません。

参考:Class UrlFetchApp

JavaScript

1vSendData = { 2 "contentType": "multipart/form-data", 3 "method":"POST", 4 "payload": vFormData 5};

投稿2020/06/07 06:30

draq

総合スコア2573

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

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

demut

2020/06/07 07:21

早速のご回答ありがとうございます。 "contentType": "multipart/form-data"で試してみましたが、エラーは変わらずでした。 以下はGASのログです。 muteHttpExceptionsは処理を継続したいために一時的に指定しましたが、指定しなかった場合でもエラーは変わらずです。 --- [20-06-07 16:00:00:563 JST] { contentType: 'multipart/form-data', method: 'POST', payload: { username:'TEST-USER', password:'abcd@1234', senddata1:'test1', senddata2:'test2' }, muteHttpExceptions: true } [20-06-07 16:00:01:449 JST] {"status":2,"message":"Invalid Input"} --- formDataオブジェクトを利用して、値をappendで追加していく情報も見つかったので試してみたのですが、formDataオブジェクトを作成しようとすると「formData is not defined」とエラーが表示されます。 form-dataで渡すには根本的な何かを間違えているのでしょうか。
demut

2020/06/07 08:05 編集

問題は解決していませんでした。 先ほどの自己解決したは誤りです(投稿内容を修正しました) 二転三転してしまい本当に申し訳ないです。
demut

2020/06/07 08:06 編集

エラーは依然として変わらずでした。 データを取得できていたと思ったのは誤りです。 根本的に何かを間違えている気がするのですが、その何かがわかりません。
draq

2020/06/07 08:07

そもそもそのAPIは from-data で渡す仕様なんでしょうか?
demut

2020/06/07 08:12

APIの送信ツール「Postman」では、Bodyでform-dataを選択してPOSTすることでデータを得られています。 PostmanのBody+form-dataがGASのform-dataと一致しているかは不明です。 そのあたりの情報も見つからず。
draq

2020/06/07 08:24

あとは、データをソース上にベタ書きして実行してみるぐらいでしょうか。 すいませんが、試せない以上これ以上はちょっとわかりません。
demut

2020/06/07 08:38

ベタ書きしてもエラーは401です。 FormDataオブジェクトも使えず、八方ふさがりです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問