目的
自分で WEB API を提供するサーバを立てたい。そのときに、
のように渡す、普通の形で提供したい。
情報源
- WEB API を実装するには、Flask で直接書く方法もありますが、Flask-RESTful というライブラリがあります。チュートリアルもシンプルです。
- 日本語の記事は探したところ見つかりませんでしたが、StackOverflow に投稿があり解決しました。
- flask restful: passing parameters to GET request では、Flask-RESTfulを使っています。
- 後日調査し、How do you get a query string on Flask?
で、Flask でも普通にquery parameters を取得できることを知りました。(^^)/
- そのほか、にも記事はいくつかあります。
- https://qiita.com/tchnkmr/items/26d271886b46c4e52dc1
- https://note.com/navitime_tech/n/nc0381517d067
実装(その1:Flask-RESTfulを使用)
以下で動かしました。flask-restful は pip でインストールしました。
from flask import Flask
from flask_restful import Resource, Api, reqparse
app = Flask(__name__)
api = Api(app)
class TaskAPI(Resource):
def get(self):
parser = reqparse.RequestParser()
parser.add_argument('key1', type=str)
parser.add_argument('key2', type=float)
query_data = parser.parse_args()
print("input_data={}".format(query_data))
return query_data
api.add_resource(TaskAPI, '/bar', endpoint='bar')
if __name__ == '__main__':
app.run(debug=True)
Flask-RESTful では、Resource を継承したクラスにgetやpost を実装します。
Flask では返り値をjsonify(data) としましたが、ここでは必要ありません。
実装したクラスをapi に route と共に登録します。
(と、コードを見て理解しています。^^;)
動作確認
まず、上記のコードを動かします。
$ python3 myapi.py
(1) curl で。&の前にバックスラッシュを入れよう。
$ curl http://localhost:5000/bar?key1=val1\&key2=12.34
{
"key1": "val1",
"key2": "12.34"
}
(2) ipython で
In [1]: from requests import put, get
In [2]: get('http://localhost:5000/bar?key1=val1&key2=12.34').json()
Out[2]: {'key1': 'val1', 'key2': '12.34'}
(3) ブラウザに入れるとjson が返っているのが分かります。
api.add_resource(TaskAPI, '/bar', endpoint='bar')
実装(その2:Flaskを使用)
じ、実はFlask だけでも同じことができました。m(__)m
from flask import request, Flask, jsonify
app = Flask(__name__)
@app.route('/bar')
def data():
return jsonify( request.args.to_dict())
if __name__ == '__main__':
app.run(debug=True)
全てrequest
に入れられているんですね。(という解釈^^;)
-
request.args
にはImmutableMultiDict([('val1', 'key1'), ('val2', '12.34')])
が入っています。 -
request.query_string
とすると、b'val1=key1&val2=12.34'
が返ってきます。
自分の場合、なんとなくFlaskだけで良いかも。
まとめ
とりあえず、目的は達成できた。REST API とはそもそも何か、HTTPとは何か、とか、エラー処理や型の確認とか、よりコードを頑健にするなど、残課題はありますが、まずはここまでとする。
これで明日の仕事は乗り切れるかな。深夜、日付が変わってしまったが。今日はこの辺りで。
(2020/12/06)
追記:
- Flask だけでもquery parameters を辞書として取得できることを知り、追記。(2020/12/07)