Flask2でGET/POSTの値を取得する

# はじめに
前回の続きで、EC2上に構築したFlask2でGET/POSTの動作確認の防備録。
REST APIでは必須のJSONの連携もまとめていきます。

[EC2にPython/Flask2を構築](https://qiita.com/miyakiyo/items/cbaf0d1e1e4769073098)

## GET

####Flask 1.*までの書き方
引数のmethodsを付けないとデフォルトはGETです

```Python:hoge.py
@app.route('/')
def index():
  return "世界のみなさん、こんにちは"

@app.route('/get1x', methods=["GET"])
def get1x():
  return "GETです"
```

Flask起動

```
flask run
```

curlで動作確認

```
curl http://127.0.0.1:5000/get1x
```
>
GETです

####Flask2の新しい書き方
getメソッドが増えた（laravelっぽい書き方？）

```Python:hoge.py
@app.get('/get2x')
def get2x():
  return "GET2です"
```

curlで動作確認

```
curl http://127.0.0.1:5000/get2x
```
>
GET2です

####パラメーター

```Python:hoge.py
@app.get('/get2x')
def get2x():
  return request.args["name"] + "です"
```

```
curl http://127.0.0.1:5000/get2x?name=yamada
```
>
yamadaです

####URLパラメーター

```Python:hoge.py
@app.get('/get2x/<name2>/myname')
def get2_myname(name2):
  return f"{name2}です"
```

```
curl http://127.0.0.1:5000/get2x/tarou/myname
```
>
tarouです

####小まとめ

```Python:hoge.py
@app.get('/get2x/<name2>/myname')
def get2_myname(name2):
  
  if "name" in request.args:
    name = request.args["name"]
  else:
    name = "ななし"

  return f"{name} {name2}です"
```

```
curl curl http://127.0.0.1:5000/get2x/tarou/myname?name=yamada
```
>
yamada tarouです

## POST

```Python:hoge.py
@app.post('/post2x')
def post2x():
  if "name" in request.form:
    name = request.form["name"]
  else:
    name = "ななし"

  if "name2" in request.form:
    name2 = request.form["name2"]
  else:
    name2 = "ななし"

  return f"{name} {name2}です"
'''

```
curl -X POST --data 'name=yamada&name2=tarou' http://127.0.0.1:5000/post2x
```
>
yamada tarouです

#### JSON取得
jsonで受け取ったデータをjsonで返す
#### importにjson追加

```Python:hoge.py
from flask import Flask, json, jsonify
```

```Python:hoge.py
@app.post('/post2x/json')
def post2x_json():

  # bodyを文字列で取得
  body = request.data.decode("UTF-8")
  # jsonをdict型に変換
  json_data = json.loads(body)

  # 応答メッセージ追加
  json_data["message"] = "ok"

  return jsonify(json_data), 200
```

```
curl -X POST -H 'Content-Type: application/json' -d '{"name":"yamada", "name2":"tarou"}' http://127.0.0.1:5000/post2x/json
```
>
{"message":"ok","name":"yamada","name2":"tarou"}

#### エラー処理を入れてみる

```Python:hoge.py
@app.post('/post2x/json')
def post2x_json():
  
  # headersにjsonが指定されていなかったらエラー
  if "Content-Type" not in request.headers or request.headers["Content-Type"] != "application/json":
    return jsonify({"message": "json形式ではありません"}), 500

  try:
    # bodyを文字列で取得
    body = request.data.decode("UTF-8")
    # jsonをdict型に変換
    json_data = json.loads(body)

    # 応答メッセージ追加
    json_data["message"] = "ok"

    return jsonify(json_data), 200

  except Exception:
    return jsonify({"message": "jsonの取得でエラーが発生しました"}), 500
```

```
curl -i -X POST -H 'Content-Type: application/json' http://127.0.0.1:5000/post2x/json
```
>
HTTP/1.0 500 INTERNAL SERVER ERROR
Content-Type: application/json
Content-Length: 103
Server: Werkzeug/2.0.1 Python/3.7.10
Date: Fri, 27 Aug 2021 05:58:25 GMT

{"message":"json\u306e\u53d6\u5f97\u3067\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f"}

## まとめ
GET/POSTの使い方とパラメーターの値取得でしたが、PUT/DELETEでも基本は同じで行けると思う。
Flask2になってlaravelっぽい書き方が出来るようになったのかな
Flask1の書き方でもOKだし、この辺はあまり変わってなさそうだ
次回はBlueprintでもまとめてみようかな

今回のサンプルコードはGitHubにアップしております
[github/flask2_demo](https://github.com/offgrid-jp/flask2_demo)