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=abcdrequest.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/**であれば
コメント