Rails APIクライアント構築手順


Rails APIクライアント構築手順

(1)クラウド9のホームページを開き(https://aws.amazon.com/jp/cloud9)コンソールにサインインをクリックします

(2)サインインします

(3)サービスを検索するに「cloud9」と入力し、cloud9のコンソールを開きます

(4)IDEエディタを開きます

(5)Railsプロジェクトをデータベースなしで作成します(オプション -O(大文字オー))

rails new testApi -O

(6)プロジェクトが追加されたことを確認します

(7)コントローラーとビューを作成します

cd testApi
rails g controller test_api index

(8)コントローラを修正します(test_api_controller.rb)

【修正前】

class TestApiController < ApplicationController
  def index
  end
end

【修正後】

require 'json'
require 'net/https'
require "uri"

class TestApiController < ApplicationController
  def index
    data={feature: [10, 20, 5, 1]}
    uri = URI.parse("http://syslink-ai-api.herokuapp.com/predict")
    http = Net::HTTP.new(uri.host, uri.port)
    req = Net::HTTP::Post.new(uri.path)
    req.set_content_type("application/json")
    req.body = data.to_json

    res = http.request(req)

    p res.code

    if res.code == "200"
      res_data = JSON.parse(res.body)
      p res_data["prediction"]
    end
  end
end

(9)Railsサーバーを起動します

rails s

(10)メニューのPreview Running Aplicationを選択します

(11)右下にブラウザが表示されるので、拡大ボタンをクリックし、画面を表示します

(12)表示された画面のurlの最後に「/test_api/index」を追加してクリックします

(13)うまくいかない場合には、ブラウザのurlを以下の通り修正します(?以降を削除)

【修正前】

https://31154717056d432488f1b23e72cb41aa.vfs.cloud9.us-east-2.amazonaws.com/?_c9_id=livepreview0&_c9_host=https://us-east-2.console.aws.amazon.com/test_api/index

【修正後】

https://31154717056d432488f1b23e72cb41aa.vfs.cloud9.us-east-2.amazonaws.com/test_api/index

(14)以下の画面が表示されればOKです

(15)結果はコンソールに表示するようコーディングしたので、確認します

"200" → レスポンスのhttpリターンコード(200:正常終了) [2] → 機械学習での結果(アヤメの分類 入力:[10, 20, 5, 1] 結果の分類:2)

API側のソース(Herokuに配備しています)

from joblib import dump, load
import flask
import numpy as np

# initialize our Flask application and pre-trained model
app = flask.Flask(__name__)
model = None


def load_model():
    global model
    print(" * Loading pre-trained model ...")
    model = load("sample-model.pkl")
    print(' * Loading end')


@app.route('/')
def index():
    return 'Hello World!'

@app.route("/predict", methods=["POST"])
def predict():
    model = load("sample-model.pkl")
    response = {
        "success": False,
        "Content-Type": "application/json"
    }
    # ensure an feature was properly uploaded to our endpoint
    if flask.request.method == "POST":
        if flask.request.get_json().get("feature"):
            # read feature from json
            feature = flask.request.get_json().get("feature")

            # preprocess for classification
            # list  -> np.ndarray
            feature = np.array(feature).reshape((1, -1))

            # classify the input feature
            response["prediction"] = model.predict(feature).tolist()

            # indicate that the request was a success
            response["success"] = True
    # return the data dictionary as a JSON response
    return flask.jsonify(response)


if __name__ == "__main__":
    load_model()
    print(" * Flask starting server...")
    app.run(host='0.0.0.0', port='8000')

(16)結果を画面に表示するように修正します

コントローラからビューへは、インスタンス変数(@xxx)で渡します。

【コントローラの修正(test_api_controller.rb)】

require 'json'
require 'net/https'
require "uri"

class TestApiController < ApplicationController
  def index
    data={feature: [10, 20, 5, 1]}
    uri = URI.parse("http://syslink-ai-api.herokuapp.com/predict")
    http = Net::HTTP.new(uri.host, uri.port)
    req = Net::HTTP::Post.new(uri.path)
    req.set_content_type("application/json")
    req.body = data.to_json

    res = http.request(req)

    p res.code

    if res.code == "200"
      res_data = JSON.parse(res.body)
      p res_data["prediction"]
      # この行を追加します
      @prediction =  res_data["prediction"] 
    end
  end
end

【ビューの修正(test_api/index.html.erb)】

<h1>機械学習の分析結果</h1>

<p>分類:<%= @prediction %></p>

修正後の画面が以下の通り表示されればOKです