RestAPIでPOSTデータを受け取る - aktnk/til GitHub Wiki

実現したいこと

  • RestAPIでPOSTデータを受け取る

実現方法

jsonデータを受け取る場合

  • app.py 実装例
from flask import Flask, request, jsonify
import json
import logging

app = Flask(__name__)
app.logger.setLevel(logging.INFO)

@app.route('/sample_json', methods=['POST'])
def sample_json():
    data = request.get_json()
    app.logger.info(data)
    return jsonify(data), 201
  • 動作確認:curl利用
$ curl -X POST -H "Content-Type:application/json" -d "{\"param1\": \"value1\", \"param2\": \"value2\"}" http://localhost:5000/sample_json
{"param1":"value1","param2":"value2"}
  • サーバ側log:curl利用時
web_flask-1  | [2025-02-05 22:22:53,555] INFO in app: {'param1': 'value1', 'param2': 'value2'}
web_flask-1  | 172.19.0.1 - - [05/Feb/2025 22:22:53] "POST /sample_json HTTP/1.1" 201 -
  • 動作確認:wget利用
 wget --method=POST --header="Content-Type: application/json" --body-data="{\"param1\":\"value1\",\"param2\":\"value2\"}" http://localhost:5000/samp
le_json
--2025-02-05 22:29:45--  http://localhost:5000/sample_json
Resolving localhost (localhost)... 127.0.0.1
Connecting to localhost (localhost)|127.0.0.1|:5000... connected.
HTTP request sent, awaiting response... 201 CREATED
Length: 38 [application/json]
Saving to: ‘sample_json’

sample_json                                    100%[=======================================================================================================>]      38  --.-KB/s    in 0s      

2025-02-05 22:29:45 (9.34 MB/s) - ‘sample_json’ saved [38/38]

$ cat sample_json
{"param1":"value1","param2":"value2"}
  • サーバ側log:wget利用時
web_flask-1  | [2025-02-05 22:29:45,449] INFO in app: {'param1': 'value1', 'param2': 'value2'}
web_flask-1  | 172.19.0.1 - - [05/Feb/2025 22:29:45] "POST /sample_json HTTP/1.1" 201 -

formデータを受け取る場合

  • app.py 実装例
from flask import Flask, request, jsonify
import json
import logging

app = Flask(__name__)
app.logger.setLevel(logging.INFO)

@app.route('/sample_form', methods=['POST'])
def sample_form():
    data = request.form.to_dict()
    app.logger.info(data)
    return json.dumps(data), 201
  • 動作確認:curl利用
$ curl -X POST -d "param1=value1" -d "param2=value2"  http://localhost:5000/sample_form
{"param1": "value1", "param2": "value2"}
  • サーバ側log:curl利用時
web_flask-1  | [2025-02-05 22:23:58,211] INFO in app: {'param1': 'value1', 'param2': 'value2'}
web_flask-1  | 172.19.0.1 - - [05/Feb/2025 22:23:58] "POST /sample_form HTTP/1.1" 201 -
  • 動作確認:wget利用
$ wget --post-data="param1=value1&param2=value"  http://localhost:5000/sample_form
--2025-02-05 22:32:33--  http://localhost:5000/sample_form
Resolving localhost (localhost)... 127.0.0.1
Connecting to localhost (localhost)|127.0.0.1|:5000... connected.
HTTP request sent, awaiting response... 201 CREATED
Length: 39 [text/html]
Saving to: ‘sample_form’

sample_form                                      100%[=======================================================================================================>]      39  --.-KB/s    in 0s      

2025-02-05 22:32:33 (6.89 MB/s) - ‘sample_form’ saved [39/39]

$ cat sample_form
{"param1": "value1", "param2": "value"}
  • サーバ側log:wget時
web_flask-1  | [2025-02-05 22:32:33,390] INFO in app: {'param1': 'value1', 'param2': 'value'}
web_flask-1  | 172.19.0.1 - - [05/Feb/2025 22:32:33] "POST /sample_form HTTP/1.1" 201 -

参考

  • Flaskサーバはdocker compose利用して立ち上げた
  • Dockerfile
FROM python:3.11-alpine3.21

ARG project_directory
WORKDIR $project_directory

RUN pip install flask
  • compose.yaml
services:
  web_flask:
    build:
      context: .
      args:
        project_directory: "/projects/"
    ports:
      - "5000:5000"
    volumes:
      - "./projects:/projects"
    environment:
      TZ: "Asia/Tokyo"
      FLASK_ENV: "development"
    command: "flask run --host 0.0.0.0 --port 5000"
  • flaskサーバ起動手順
$ docker compose up -d
[+] Running 2/2
 ✔ Network rest_relay_default        Created                                                           0.0s
 ✔ Container rest_relay-web_flask-1  Started                                                           0.3s
$
  • flaskサーバlog確認手順
$ docker compose logs
web_flask-1  |  * Debug mode: off
web_flask-1  | WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
web_flask-1  |  * Running on all addresses (0.0.0.0)
web_flask-1  |  * Running on http://127.0.0.1:5000
web_flask-1  |  * Running on http://172.19.0.2:5000
web_flask-1  | Press CTRL+C to quit
$