@nqounetです。
バックエンドAPIがまだ完成していないのに、フロントエンドの開発を進めなければならない。そんな経験はありませんか?本シリーズでは、PerlとMooを使って「偽API」を作り、この課題を解決する方法を学んでいきます。
このシリーズについて
このシリーズは「Mooで覚えるオブジェクト指向プログラミング」シリーズの続編です。Perl入学式卒業レベルで、MooでのOOP入門を完了した読者を対象としています。
全8回を通じて、シナリオに応じて異なるAPIレスポンスを生成できる「APIレスポンスシミュレーター」を構築します。最初はシンプルに始めて、段階的に機能を追加しながら、設計上の課題とその解決方法を一緒に体験していきましょう。
このシリーズで得られるもの:
- 実務でありがちな「APIがないと検証できない」問題を自作ツールで解決できる
- シナリオ追加のたびに設計が改善される実感を得られる
- 最終的にはFactory Methodパターンを自然に習得できる
前提知識:
- Perl v5.36以降の基本文法(signatures、postfix dereferenceなど)
- Mooによるクラス定義の基礎
シリーズ全体の目次は以下をご覧ください。
今回のゴール
成功レスポンスを返すだけの、最もシンプルなAPIシミュレーターを作ります。
flowchart LR
subgraph MockApi
create_response["create_response()"]
send_request["send_request()"]
end
subgraph Response
render["render()"]
end
send_request --> create_response
create_response --> Response
Response --> render
render --> Output["HTTPレスポンス文字列"]
Responseクラスを作る
まずは、APIのレスポンスを表現するクラスを作りましょう。HTTPステータスコード、Content-Type、そしてJSONボディを持つシンプルな構造です。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
| #!/usr/bin/env perl
# 言語: perl
# バージョン: 5.36以上
# 依存: Moo, JSON(cpanmでインストール)
use v5.36;
package Response {
use Moo;
use JSON qw(encode_json);
has status => (
is => 'ro',
required => 1,
);
has content_type => (
is => 'ro',
default => sub { 'application/json' },
);
has body => (
is => 'ro',
required => 1,
);
sub render($self) {
my $json_body = encode_json($self->body);
return sprintf(
"HTTP/1.1 %s\nContent-Type: %s\n\n%s",
$self->status,
$self->content_type,
$json_body,
);
}
}
|
Responseクラスは3つの属性を持っています:
status: HTTPステータスコード(例: “200 OK”)content_type: コンテンツタイプ(デフォルトは"application/json")body: レスポンスボディ(Perlのデータ構造)
renderメソッドは、これらの属性を組み合わせてHTTPレスポンス風の文字列を生成します。
MockApiクラスを作る
次に、このResponseを生成して返すMockApiクラスを作りましょう。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
| package MockApi {
use Moo;
sub create_response($self) {
return Response->new(
status => '200 OK',
body => {
success => JSON::true,
message => 'リクエストが正常に処理されました',
data => {
id => 1,
name => 'サンプルアイテム',
},
},
);
}
sub send_request($self) {
my $response = $self->create_response;
return $response->render;
}
}
# 実行
my $api = MockApi->new;
say $api->send_request;
|
MockApiクラスは2つのメソッドを持っています:
create_response: 成功レスポンスを生成するsend_request: レスポンスを生成し、レンダリングして返す
実行結果
このスクリプトを実行すると、以下のような出力が得られます。
1
2
3
4
| HTTP/1.1 200 OK
Content-Type: application/json
{"data":{"id":1,"name":"サンプルアイテム"},"message":"リクエストが正常に処理されました","success":true}
|
見事に成功レスポンスが生成できました。これで、バックエンドがなくてもフロントエンドの開発を進められます。
完成コード
今回の完成コードを1ファイルにまとめると、以下のようになります。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
| #!/usr/bin/env perl
# 言語: perl
# バージョン: 5.36以上
# 依存: Moo, JSON(cpanmでインストール)
use v5.36;
package Response {
use Moo;
use JSON qw(encode_json);
has status => (
is => 'ro',
required => 1,
);
has content_type => (
is => 'ro',
default => sub { 'application/json' },
);
has body => (
is => 'ro',
required => 1,
);
sub render($self) {
my $json_body = encode_json($self->body);
return sprintf(
"HTTP/1.1 %s\nContent-Type: %s\n\n%s",
$self->status,
$self->content_type,
$json_body,
);
}
}
package MockApi {
use Moo;
sub create_response($self) {
return Response->new(
status => '200 OK',
body => {
success => JSON::true,
message => 'リクエストが正常に処理されました',
data => {
id => 1,
name => 'サンプルアイテム',
},
},
);
}
sub send_request($self) {
my $response = $self->create_response;
return $response->render;
}
}
my $api = MockApi->new;
say $api->send_request;
|
まとめ
今回は、シンプルなAPIレスポンスシミュレーターの土台を作りました:
Responseクラス: HTTPレスポンスをオブジェクトとして表現MockApiクラス: レスポンスを生成して返す
しかし、実際のAPI開発では成功レスポンスだけでなく、エラーレスポンスも必要です。次回は「エラーも返したい!」という要求に対応しながら、コードがどのように複雑化していくかを見ていきます。
次回の記事はこちらです。