今更 Open API Document の 分割に向きあう

>100 Views

November 28, 25

スライド概要

Mobile Tech Talk Osaka by TRAILBLAZER & TRUSTDOCK で発表した資料。
https://trustdock.connpass.com/event/374026/

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

ダウンロード

関連スライド

各ページのテキスト
1.

今更 Open API Document の 分割に向きあう experopero

2.

こんにちは

3.

北村 涼||experopero|| funnelbit • エンジニアです • 奈良に住んでいます • サーバサイドとフロントエン ド、iOS、Android など色々や っていましたが最近は Android ばかりやっています • X: https://x.com/experopero • Blog: https:// funnelbit.hatenablog.com/

4.

GraphQL

5.

最高

6.

NOW

7.

REST

8.

最近の事情を知らない

9.

自分が REST やってた 時代

10.

ドキュメントはコード

11.

サーバサイドもフロントも 同時に同じ人が作るから

12.

特に問題なし

13.

フロントも動的型付け

14.

コードレビューで防ぐと いう世界観

15.

しかし今は

16.

多数の配信先が静的型付 け

17.

Typescript/Kotlin/Swift etc…

18.

どうするのかというと

19.

Open API Document

20.

openapi.yaml

22.

openapi.json

23.

適当に作ると

24.

巨大化していく

25.

100行

26.

500行

27.

1000行

28.

9000行

29.

「Openapi.yaml の記載、レビュー お願いします!」 9200行

30.

🤯

31.

勘弁してくれ

32.

分割しようよ

33.

どう分割すれば?

34.

適当に調べた

35.

みんな好き勝手やってる 気がする

36.

とりあえずやってみる

37.

openapi: 3.0.4 info: title: Sample API description: これはサンプルAPIの説明です version: 1.0.0 contact: name: API Support email: [email protected] servers: - url: https://api.example.com/v1 description: 本番環境 - url: https://staging-api.example.com/v1 description: ステージング環境 paths: /users: get: openapi.yaml

38.

openapi: 3.0.4 info: title: Sample API description: これはサンプルAPIの説明です version: 1.0.0 contact: name: API Support email: [email protected] servers: - url: https://api.example.com/v1 description: 本番環境 - url: https://staging-api.example.com/v1 description: ステージング環境 paths: /users: get: openapi.yaml

39.

$ref

40.

fi $ref: "reference to de nition"

41.

fi https://swagger.io/docs/ speci cation/v3̲0/using-ref/

42.

paths: /users: get: … responses: '200': … $ref: '#/components/schemas/User' components: schemas: User: type: object openapi.yaml

43.

paths: /users: get: … responses: '200': … $ref: '#/components/schemas/User' components: schemas: User: type: object openapi.yaml

44.

paths: /users: get: … responses: '200': … $ref: ‘schemas.yaml#/components/schemas/User'

45.

よしわかった!!

46.

エンドポイントの paths は 肥大化するから分割するぞ!!

47.

openapi: 3.0.4 … $ref: paths.yaml

48.

49.

openapi: 3.0.4 … paths: $ref: paths.yaml

50.

51.

openapi: 3.0.4 … paths: /users: $ref: 'paths/users.yaml'

52.

53.

fi Open API Speci cation をちゃんと読め

54.

fi https://swagger.io/ speci cation/

55.

paths: Map[{String}, {Path Item Object}]

56.

Path Item Object

57.

$ref, summary, description, get, put, post, delete, options, head, patch, trace, servers, parameters

58.

此れに沿う

59.

Root は paths を持つことができる。 Paths は Path Item を持つことができる。 Path Item の内部は $ref できる。 openapi: 3.0.4 … paths: /users: $ref: 'paths/users.yaml'

61.

実は分割した Root 以外のyaml は 無秩序

62.

分割後ファイルはただの yaml

63.

get: … $ref: '#/components/schemas/User' components: schemas: User: type: object required: - id - name - email properties: id: type: integer format: int64 description: ユーザーID example: 1 Paths/users.yaml

64.

get: … $ref: '#/components/schemas/User' components: schemas: User: type: object required: - id - name - email properties: id: type: integer format: int64 description: ユーザーID example: 1 Paths/users.yaml

65.

$ref, summary, description, get, put, post, delete, options, head, patch, trace, servers, parameters

66.

Components: 書けるはずがないが

67.

書ける

68.

VSCode で openapi の 拡張入れても

69.

Openapi のファイルじ ゃないとみなすから。

70.

じゃあ好き勝手書けるんですね! 👌 最強の分割を見せてやるぞ!

71.

しかし

72.

重要なポイント

73.

yaml は合体せねばなら ない

74.

Open API Generator Kotlin

75.

分割した Yamlを 読める

76.

Swift Open API Generator

77.

分割した Yaml 読めない

78.

「yaml、S3 におきたい んすよね~」

79.

結合したくなる

80.

分割したいけど 分割したら 困る!?

81.

ならば書くのは分割 成果物は合体後だ

82.

Redocly

83.

https://redocly.com/docs/ cli/commands/bundle

84.

これで合体可能

85.

fi Open API Speci cation に沿った分割なら

86.

難なく結合できる

87.

fi Open API Speci cation に 沿っていない分割方法だと

88.

結合後に 構文エラーになる

89.

get: … $ref: '#/components/schemas/User' components: schemas: User: type: object required: - id - name - email properties: id: type: integer format: int64 description: ユーザーID example: 1 paths/users.yaml

90.

schema は Root にしか存在しないから。

91.

ただし

92.

Open API Generator な ら無茶しても結合できる

93.

Open API Generator な ら無茶しても結合できる

94.

$ openapi-generator-cli generate -g openapi-yaml -i a.yaml -o b.yaml

95.

get: … $ref: '#/components/schemas/User' components: schemas: User: type: object required: - id - name - email properties: id: type: integer format: int64 description: ユーザーID example: 1 Paths/users.yaml

96.

あまりお勧めしない

97.

1. いくらでも好きな書き 方ができてしまう

98.

どこに何を書いていいか 逆に難しい

99.

俺の考えた最強の書き方 を

100.

発明せねばならない

101.

2. Open API Generator しか結合不可能

102.

Open API Generator が 転けたら終了

103.

先日も奇妙なエラー

104.

type: object … properties: … favorites: allOf: - $ref: '#/components/schemas/Favorites' nullable: true followers: allOf: - $ref: '#/components/schemas/Followers' nullable: true Schemas/users.yaml

105.

type: object … properties: … favorites: allOf: - $ref: '#/components/schemas/Favorites' nullable: true followers: allOf: - $ref: '#/components/schemas/Followers' nullable: true Schemas/users.yaml

106.

結合後に

107.

片方の nullable: true 消失

108.

原因

109.

不明 (まだよく調べていない)

110.

ただし

111.

一つの学び

112.

やんちゃなことはしない 方がいい

113.

Redocly

114.

ただ結合するだけ

115.

シンプル

116.

結果も予測しやすい

117.

Open api generator

118.

よしなにマージしようと する

119.

結果が読みにくい

120.

シンプルに越したことは ない

121.

シンプル第1を考えると

122.

- openapi.yaml - paths/ -- users.yaml - components/ -- responses/ -- requestBodies/ -- schemas/ --- Users.yaml

123.

- openapi.yaml - paths/ -- users.yaml - components/ -- responses/ -- requestBodies/ -- schemas/ --- Users.yaml

124.

エントリポイント

125.

ベタがき禁止

126.

全部 $ref を並べる エントリポイントとして。

127.

openapi: 3.0.4 … paths: /users: $ref: 'paths/users.yaml' components: schemas: User: $ref: 'components/schemas/User.yaml' openapi.yaml

128.

- openapi.yaml - paths/ -- users.yaml - components/ -- responses/ -- requestBodies/ -- schemas/ --- Users.yaml

129.

エンドポイント書くとこ ろ

130.

Response する内容を 可能な限り ベタがきしない

131.

get: summary: ユーザー一覧を取得 description: すべてのユーザーのリストを取得します operationId: getUsers tags: - Users responses: '200': description: 成功 content: application/json: schema: type: object properties: users: type: array items: $ref: '../api.yaml#/components/schemas/User'

132.

- openapi.yaml - paths/ -- users.yaml - components/ -- responses/ -- requestBodies/ -- schemas/ --- Users.yaml

133.

共通化したい 構造体を 書くところ

134.

type: object required: - id - name - email properties: id: type: integer format: int64 description: ユーザーID example: 1 name: type: string description: ユーザー名 example: 山田太郎 email: type: string format: email description: メールアドレス example: [email protected] createdAt: type: string format: date-time description: 作成日時 example: '2024-01-01T00:00:00Z' Components/schemas/ User.yaml

135.

分け終わったら

136.

Redocly bundle

137.

一つの openapi.yaml へ

138.

こんなところですかね

139.

実は他にも色々

140.

エンドポイントのバージョ ン増えたらどう分けるの

141.

openapi.yaml を書いたわけなので、 Redocly で bundle した後の yaml 名どうすんの?

142.

Path パラメータとったエンドポイントの yaml 名どうすんの? /users/{id}

143.

Openapi 3.0.4 って古くな い?時代は 3.1.x でしょ?

144.

興味がある人は後で。

145.

まとめ

146.

Redcoly で結合すること

147.

fi 分割後ファイルも Open API Speci cation に 沿ってあげること

148.

独自色はできる限り出さ ない

149.

fi ディレクトリの分割も Open API Speci cation の記載っぽくする

150.

おしまい