【Python】Flask HTTPメソッド4種

## はじめに
pythonでHTTPメソッドを扱う方法についてまとめていきます．
FlaskでREST APIを作成する際にはよく使う記述をまとめました．
初学者の方の参考になればと思います！

## HTTPメソッドについて
HTTP ver1.1でのメソッド一覧は以下の通りです．

### GET
URIで指定した情報を要求する．
URIがファイル名の場合はそのファイルの中身を，プログラム名の場合はプログラムの出力を返す．

### HEAD
GETと同様の処理だが，HTTPヘッダのみを返す．

### POST
クライアントからデータを（名前と値)のセットで渡す．
使用例：フォームデータを送る時

### OPTIONS
通信オプションの通知等．

### TRACE
サーバが受け取った要求行とヘッダ行をそのまま送り返す．

### DELETE
URIで指定したサーバ上のファイルを削除する．

### PUT
URIで指定したサーバ上のファイルを置き換える．

### PATCH （Appendix）
PUTと同様の処理だが，差分のみを置き換える

### LINK （Appendix）
他の情報との関連付けを行う．

### UNLINK （Appendix）
LINKで設定した関連を外す．

仕様がAppendixのものは正式に定義されているものではないです．
今回の記事はGET, POST, PUT, DELETEについて実装をまとめます．

## 環境構築
まずは，pythonやFlaskを扱う環境を作成します．
HTTPリクエストを受け取るサーバ側でモジュールをインストールします．

```bash
sudo apt install python3 python3-pip
pip3 install flask
```
これだけでflaskの準備はOKです．

## Flaskでの扱い方
### Flaskの基礎
まずは，Flaskの基本型を作ります．

```python
from flask import Flask

app = Flask(__name__)

@app.route('/', methods=['###'])
def index():
    return 'hello world'

if __name__ == '__main__':
    app.run(host="0.0.0.0", port=5000, debug=True)
```
flaskをインポートすることで使用可能です．
`app = Flask(__name__)`によってアクセスされたURIによって処理を変更できるようになります．
URIの指定は`@app.route()`で行います．
`@app.route('\')`であればドメインのみあるいはIPアドレスのみでアクセスされた場合を指します．
引数である`methods=['']`でHTTPメソッドを指定します．

### GETを使ったデータ処理
GETを使った受け取りでは，methodsを'GET'に指定します．
受け取った引数の中身を取り出したい場合は，requestライブラリを使用します．

```python
from flask import Flask, jsonify, request

@app.route('/get', methods=['GET'])
def get_request():
    name = request.args['name']
    return jsonify(name.upper())
```

`request.args['']`で取り出したい引数のkeyを入れることでvalueを変数に格納できます．
上記の例ではnameというkeyのvalueを取り出しています．
また，JSON形式でレスポンスを返すため，jsonifyライブラリを使用しています．

### POSTを使ったデータ処理
POSTを使った受け取りでは，methodsを'POST'に指定します．
受け取った引数の中身を取り出したい場合も，requestライブラリを使用します．

```python
from flask import Flask, jsonify, request

@app.route('/post', methods=['POST'])
def post_request():
    post_data = request.get_json(force=True)
    name = post_data['name']
    return jsonify(name.lower())
```
`request.get_json()`でPOSTで送信したデータを変数に格納することができます．
その後辞書と同様に取り出したい引数のkeyを指定することでvalueを変数に格納できます．
上記の例ではnameというkeyのvalueを取り出しています．


### PUTを使ったデータ処理
PUTを使った受け取りでは，methodsを'PUT'に指定します．
これは主にデータの修正に使われます．

```python
from flask import Flask, jsonify, request

@app.route('/put/<id>', methods=['PUT'])
def update_post(id):
    data = request.json
    db[int(id)] = data
    return jsonify(db)
```

`request.json`で送信したデータを受け取っています．
flaskではrouteに`/<パラメータ>`と指定することで関数にパラメータを渡すことができます．
配列のid番目をリクエストから受け取った内容で置き換えています．

### DELETEを使ったデータ処理
DELETEを使った受け取りでは，methodsを'DELETE'に指定します．
これは主にデータの削除に使われます．

```python
from flask import Flask, jsonify, request

@app.route('/delete/<id>', methods=['DELETE'])
def delete_post(id):
    db.pop(int(id))
    return jsonify(db)
```
PUTを使った時とほぼ同様です．


### curlコマンドを使ったHTTPリクエスト

```bash
curl -X <HTTPメソッド> -H "Content-Type: application/json" -d '{<key>:<value>}' <ホスト名>:5000/
```
curlコマンドのオプションを使用することでリクエストを送ることができます．

### pythonでのHTTPリクエスト
POSTの例を載せます．

```python
import requests
import json

url = '<ホスト名>'
payload = { <key>:<value> }
header = {'Content-Type' : 'application/json'}
response = requests.post(url, data = json.dumps(payload).encode("utf-8"), headers = header)
for res in response:
    print(res)
response.close()
```

## おわりに
FlaskでのHTTPメソッドについてまとめてみました．
PythonでAPIを作る際には参考にしてみてください．