💬
初めてのdartでJSONを返すAPIを作成する
とりあえずさっとdartでJSONを返すAPIを作りたくなりました。
全くdartは使ってないので分からない事だらけなのですが、dartの公式ではshelfというライブラリがオススメなのかなと思って使ってみました。
今回はまずはlocalhost:8081/hello
を叩くと下のjsonが返るだけのAPIです。
{
'greeting': 'hello'
}
私はWindowsで作成しましたが、Linuxなどでも大きく変わらないと思います。
dart createでプロジェクトを作る
まずはプロジェクトを作ります。
dart create web_api
言語のcliにプロジェクト作成コマンドがあるのは楽で悩まないで済むので良いですね。
shelfをimportする
dependenciesを追加します。
pubspec.yaml
dependencies:
shelf: ^1.3.0
shelf_router: ^1.1.2
routerがないとpathのハンドリングの仕方がわからないので使います。
実際に作ってみる
importする
まずはimportしておきます
bin/web_api.dart
import 'package:shelf/shelf.dart';
import 'package:shelf/shelf_io.dart' as shelf_io;
import 'package:shelf_router/shelf_router.dart';
mainを書く
今回はAPIを一つだけ作成するのであまり凝る必要はないですが、Service classを作ってその中で/hello
のpathをハンドリングしてみようと思います。
web_api.dart
void main() async {
final service = Service();
final server = await shelf_io.serve(service.handler, 'localhost', 8081);
print('Server running on localhost:${server.port}');
}
一応サーバが動いたことが分かるようにlogも出力しておきます。
で、Service classを作成します。
web_api.dart
class Service {
Handler get handler {
final router = Router();
// `/hello`をハンドリングする
router.get('/hello', _helloHandler);
return router;
}
}
返す内容も一応オブジェクト(?)を作成しましょう。(dartではこういうのオブジェクトって言うんですか?)
web_api.dart
Response _helloHandler(request) {
return Response.ok(
const JsonEncoder.withIndent(' ').convert({'greeting': 'hello'}),
headers: {'content-type': 'application/json'},
);
}
これで完成です。
動かして試す
まずは動かします。
❯ dart run
Building package executable...
Built web_api:web_api.
Server running on localhost:8081
大丈夫そうなので打ってみましょう。
❯ curl localhost:8081/hello -v
* Trying 127.0.0.1:8081...
* Trying ::1:8081...
* Connected to localhost (::1) port 8081 (#0)
> GET /hello HTTP/1.1
> Host: localhost:8081
> User-Agent: curl/7.79.1
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< date: Wed, 18 May 2022 06:02:40 GMT
< content-length: 25
< x-frame-options: SAMEORIGIN
< content-type: application/json
< x-xss-protection: 1; mode=block
< x-content-type-options: nosniff
< server: dart:io with Shelf
<
{
"greeting": "hello"
}* Connection #0 to host localhost left intact
content-type: application/json
で欲しいjsonが返ってきました!
良かった良かった。
その他
実際には
- リクエスト毎のlog出力
- getパラメータによって動的にresponseを変更
- postなど別のHTTPメソッドのハンドリング
などなど欲しい物があるとは思いますが。この記事ではここまで。
Discussion