💬

初めてのdartでJSONを返すAPIを作成する

2022/05/18に公開

とりあえずさっとdartでJSONを返すAPIを作りたくなりました。
全くdartは使ってないので分からない事だらけなのですが、dartの公式ではshelfというライブラリがオススメなのかなと思って使ってみました。
https://dart.dev/tutorials/server/httpserver

今回はまずは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