カサレリア。katzenです。
- 起動すると指定ポートでListenする。
- 書き込みなどは行わず参照のみ。(Not RESTful)
- HTTPプロトコルで通信を行う。GET only
- ルーティングによりJsonを返す。
- パラメータを指定して、Jsonに埋め込める。
3まで完成している感じですね。
今回はJsonを返せるようにしましょう。
import json
で使えそうです。
早速組み込んで行きましょう。
import vweb
import json
struct App{
vweb.Context
}
struct Result {
status bool
message string
}
fn main() {
vweb.run(&App{}, 8080)
}
fn (mut app App) index() vweb.Result {
result := &Result{
status: true
message: "タイヤが空を飛ぶな"
}
res := json.encode(result)
return app.text(res)
}
Result
という構造体を作って、Jsonで返すようにしました。
簡単ですね。
残すは5のパラメータを受け取り、戻りに反映する処理です。
indexでやると色々不都合があるので、
http://localhost/say/<message>
みたいなインターフェースを作りましょう。
vwebによると、パラメータは
["/<path>/:<param>"]
の様にヒントを与えてあげればいいようです。
...
['/say/:message']
fn (mut app App) say(message string) vweb.Result {
result := &Result{
status: true
message: "おかしいですよ!" + message + "さん"
}
res := json.encode(result)
return app.text(res)
}
...
こんな感じですね。アクセスしてみましょう。
http://localhost:8080/say/カテジナ
{"status":true,"message":"おかしいですよ!カテジナさん"}
できましたね。パラメータがメッセージに入ります。
ここまで書いてちなみになのですが、
jsonを返す機能はvwebに標準で組み込まれています。
なので、import json
とか実は必要ないですし、json.encode
なんかも必要ないです。
res := json.encode(result)
return app.text(res)
これを
とするだけで大丈夫です。ごめんなさい。
そして、なぜこれに気がついたかと言いますと、Webサーバはクライアント(ブラウザなど)に、これがどういった形式なのか伝える必要があります。
それがContext-Type
というものなのですが、
これをどう指定するのかなと調べていたら、jsonメソッドを使うことで実現していたというわけです。
完成したソースを載せておきます。
import vweb
struct App{
vweb.Context
}
struct Result {
status bool
message string
}
fn main() {
vweb.run(&App{}, 8080)
}
fn (mut app App) index() vweb.Result {
result := Result{
status: true
message: "タイヤが空を飛ぶな"
}
return app.json(result)
}
['/say/:message']
fn (mut app App) say(message string) vweb.Result {
result := Result{
status: true
message: "おかしいですよ!" + message + "さん"
}
return app.json(result)
}
vweb
はリファレンスが整っていない部分があるので、サンプルやソースを見て対応する感じになりますね。