Cloud Functions の Python は、裏側で Flask フレームワークが動いています。
Cloud Functions の Python では、この Flask フレームワークの request メソッドを使用して、クライアントアプリから GET や POST のリクエストパラメータを受け取ることが出来ます。
- GET メソッド:クエリパラメータ(クエリ文字列、URL パラメータ)
- POST メソッド:リクエストボディ
この記事では、flask.request
を使用して、リクエストメソッドごとに Cloud Functions でリクエストパラメータを取得する方法を紹介します。
GET メソッド
HTTP GET で送られてきたデータ(クエリパラメータ)は、Flask の request.args
で受け取ることが出来ます。
https://{REGION}-{PROJECT_ID}.cloudfunctions.net/{FUNCTION_NAME}?abc=1234&stu=abcd
request.args
で受け取った値は to_dict
メソッドで辞書に変換しておくと何かと便利なのでオススメです。
def main(request):
data = request.args.to_dict()
abc = data.get('abc')
stu = data.get('stu')
return f"abc: {abc}, stu: {stu}"
POST メソッド
HTTP POST で送られてきたデータ(リクエストボディ)は、リクエストヘッダのContent-Type
の値に応じてFlaskのインスタンスや関数を使い分けます。
application/json
https://{REGION}-{PROJECT_ID}.cloudfunctions.net/{FUNCTION_NAME}
{
"abc": "1234",
"stu": "abcd"
}
request.get_json
で受け取った値は、最初から辞書になっています。
def main(request):
data = request.get_json() # <class 'dict'>
abc = data.get('abc') # 1234
stu = data.get('stu') # abcd
return f"abc: {abc}, stu: {stu}"
application/x-www-form-urlencoded
https://{REGION}-{PROJECT_ID}.cloudfunctions.net/{FUNCTION_NAME}
{
"abc": 1234,
"stu": "abcd"
}
GET と同様に、request.form
で受け取った値はto_dict
メソッドで辞書に変換しておくと便利です。
def main(request):
data = request.form.to_dict() # <class 'dict'>
abc = data.get('abc') # 1234
stu = data.get('stu') # abcd
return f"abc: {abc}, stu: {stu}"
その他の application/**
リクエストヘッダのContent-Type
がapplication/json
とapplication/x-www-form-urlencoded
以外の場合、request.get_data
を使用してリクエストパラメータを受け取ります。
https://{REGION}-{PROJECT_ID}.cloudfunctions.net/{FUNCTION_NAME}
{
"abc": "1234",
"stu": "abcd"
}
GET と同様に、request.get_data
で受け取った値は辞書に変換しておくと便利です。ただし、この値は JSON エンコードされているので、辞書形式にjson.loads
でデコードする必要があります。
import json
def main(request):
data = json.loads(request.get_data()) # <class 'dict'>
abc = data.get('abc') # 1234
stu = data.get('stu') # abcd
return f"abc: {abc}, stu: {stu}"
リクエスト内容がわからないとき
使用する Web API によっては、 サーバに送られる情報がドキュメントに書かれていない不親切なケースもあるので、そのときの対応策を紹介します。
その方法とは、Cloud Functions でリクエストパラメータを受け取るために必要な リクエストメソッド ( GET か POST か)や リクエストヘッダ ( Content-Type )が特定できればいいので、それらを調べるコードを書くことです。
def main(request):
method = request.method
content_type = request.content_type
return f"method: {method}, content_type: {content_type}"
レスポンスの内容が
method: GET, content_type: None
であればmethod: POST, content_type: application/json
であればmethod: POST, content_type: application/x-www-form-urlencoded
であればmethod: POST, content_type: application/**
であれば
コメント