WEB APIサーバーをお手軽に構築する

カテゴリー:  Tech タグ:  programming python ruby web
/images/programming.webp

仕事で協力会社の方に、WEB APIサーバーのサンプルをお渡ししなければならなかったので RubyとPythonでサンプルを作ってみました。

サンプルアプリ

サンプルアプリは、 以下のようなJSONのリクエストを受ける想定です。

{
    "userid" : "0990909090"
}

このuseridをキーとして、ユーザー情報をJSON形式で返すAPIを想定してます。 サンプルなので、リクエストボディからリクストのJSONを取り出す部分も 作っていますが、レスポンスはほぼリテラルを返しているだけのサンプルです。

レスポンスボデイの形式は、以下のような形式です。

{
  "user":{
     "age":              29,
     "company":          "White Company",
     "gender":           "male",
     "id":               "0990909090",
     "name":             "山田太郎"
  }
}

Python + Flaskの例

以下は Pythonでflaskを利用したものです。

ルートにリクエストが来ると、postでもgetでもWebページを返すようにしています。 詳細はコードみて下さい。

from flask import *

app = Flask(__name__)
# これがないと日本語が文字化けする。
app.config['JSON_AS_ASCII'] = False

@app.route("/api", methods=["POST"])
def api_return():
    try:
        print(request)
        userid = request.json['userid']
        print("Userid = {}".format(userid))
        user = {
                "id" : userid,
                "name" : "山田太郎",
                "gender" : "male",
                "age" : 29,
                "company" : "White Company"}
        return jsonify({"user":user})
    except:
        return """
            エラーが発生しました。
        """
@app.route("/", methods=["GET","POST"])
def hello_world():
    if request.method == "GET":
        return """
            <!DOCTYPE html>
            <html>
            <head>
              <title>Hello World!</title>
              <meta charset="utf-8">
              <meta name="viewport" content="width=device-width, initial-scale=1">
            </head>
            <body>
              <section>
                <p> Hello World! とかやってんじゃねーよ </p>
                <form action="/" method="POST">
                <label for="userid">User ID:</label>
                <input name="userid" name="userid" required minlength="10" size=10></input>
                </form>
              </section>
            </body>
            </html>
    """
    else:
        try:
            userid = str(request.form["userid"])
            user = {
                "id" : userid,
                "name" : "山田太郎",
                "gender" : "male",
                "age" : 29,
                "company" : "White Company"}
            return jsonify({"user":user})
        except:
            return """
                エラーが発生しました。
            """

Ruby + Sinatraの例

Pythonとほぼ同じ実装ですが、ルートのレスポンスについては実装していません。

require 'sinatra/base'
require 'json'


class MyApp < Sinatra::Base

  get '/' do
    '<p> hello!</p>'
  end

  post '/api' do
    params = JSON.parse request.body.read
    userid = params["userid"]
    user_json = "{\"user\":{\"age\":29,\"company\":\"White Company\",\"gender\":\"male\",\"id\":\"#{userid}\",\"name\":\"山田太郎\"}}"
    user_hash = JSON.parse(user_json)
    JSON.generate(user_hash)
  end

  run!
end

必要な方は、 https://github.com/yostos/sampleWebAPI.git からどうぞ。

コメント

Comments powered by Disqus