Nim 言語で RESTful API 作ってみた 3(新規作成・更新編)

前回まででユーザ情報の取得と、一覧情報の取得ができるようになりました

enomotodev.hatenablog.com

今回はユーザの新規作成と更新を実装していきたいと思います

ユーザの新規作成

早速コードを書いてみます

  post "/users":
    var params = request.formData # ①
    var name = params["name"].body # ②
    var id = db.tryInsertId(sql"insert into users (name) values (?)", name) # ③
    var data = %*{"id": id, "name": name}
    resp $data, "application/json"
  1. form で送られたデータを params という変数に格納しています
  2. form で送られた name という key のデータを取得しています
  3. users テーブルに insert し、ID を取得しています

curl で実際にテストしてみます

$ curl -F name=enomotodev localhost:5000/users
{"id":4,"name":"enomotodev"}

レスポンスはきちんと返ってきましたが、一覧にもアクセスして確かめてみましょう

$ curl localhost:5000/users
{"total":4,"users":[{"id":"1","name":"foo"},{"id":"2","name":"bar"},{"id":"3","name":"baz"},{"id":"4","name":"enomotodev"}]}

新規作成されているのが確認できました!

ユーザの更新

今度はユーザデータの name の部分を更新してみたいと思います

  patch "/users/@id":
    var params = request.formData
    var name = params["name"].body
    db.exec(sql"update users set name = ? where id = ?", name, @"id")
    var data = %*{"id": @"id", "name": name}
    resp $data, "application/json"

SQL を発行しているところ以外、新規作成のときとほとんど変わらないですね

curl でたたいてみます

$ curl -X PATCH -F name=enomotodev2 localhost:5000/users/4
{"id":"4","name":"enomotodev2"}

更新されたようなので、再度一覧にもアクセスして確かめてみます

$ curl localhost:5000/users
{"total":4,"users":[{"id":"1","name":"foo"},{"id":"2","name":"bar"},{"id":"3","name":"baz"},{"id":"4","name":"enomotodev2"}]}

更新されているのが確認できました!

ここまでのコードは下記のようなかたちになりました

import jester, asyncdispatch, json, db_mysql

let db = open("localhost", "user", "password", "test_db")

routes:
  get "/":
    resp "Hello World!"
  get "/users":
    var rows = db.getAllRows(sql"select * from users")
    var users: seq[JsonNode]
    users = @[]
    for row in rows:
      users.add(%*{"id": row[0], "name": row[1]})
    var data = %*{"total": users.len, "users": users}
    resp $data, "application/json"
  post "/users":
    var params = request.formData
    var name = params["name"].body
    var id = db.tryInsertId(sql"insert into users (name) values (?)", name)
    var data = %*{"id": id, "name": name}
    resp $data, "application/json"
  get "/users/@id":
    var row = db.getRow(sql"select * from users where id = ?", @"id")
    var data = %*{"id": row[0], "name": row[1]}
    resp $data, "application/json"
  patch "/users/@id":
    var params = request.formData
    var name = params["name"].body
    db.exec(sql"update users set name = ? where id = ?", name, @"id")
    var data = %*{"id": @"id", "name": name}
    resp $data, "application/json"

runForever()

まとめ

Nim を使って簡単な API を作ってみましたが、やはりドキュメントが少なく、パッケージもあまり多くない印象です…

ですが、比較的簡単に色々作れるので、これからパッケージも自分で作ってみたいと思います

Nim in Action

Nim in Action