SlideShare a Scribd company logo
1 of 36
Download to read offline
Swaggerによる
モデルファースト!?
API開発
よもやま話
by TIS株式会社 ⼩⻄ 啓介
⾃⼰紹介
⼩⻄ 啓介 (KONISHI Keisuke)
•  SIerに勤める12年⽬の現場エンジニア
•  昔
–  XML DBの普及を夢⾒てた
–  XML DB プログラミングコンテストで最優秀賞
•  最近
–  Startup Weekend FinTechで参加チームが、優勝
•  API Meetupの運営チームに参加
Swaggerとの出会い
Swaggerとの出会い
•  昨年、スマホアプリ向けのAPI開発で
 API仕様をExcelで書きたくなかった
– 漏れのないフォーマットが作れない
– 仕様書からAPIスタブを⽣成したい
•  「Swagger」を発⾒
– 佐々⽊拓郎さんのSlide
–  http://www.slideshare.net/takurosasaki/swaggerapi
パイロットプロジェクトの概要
お断り
現在進⾏中の案件の為、業務的な
話や実際に作成したAPI仕様などは、
ご紹介できません。
その代わり? サンプルとして「Redmine
API」のSwagger定義を作成しました。
→ 完成したらGitHubに上げます。(たぶん)
パイロットプロジェクトの概要
•  期間は3か⽉
•  ⽬的
–  「使われるAPI」を⽬指す
–  API利⽤者に事前公開しフィードバックを得る
•  やること
–  ドラフトAPI仕様の策定
–  サンドボックスの構築
•  進め⽅
–  モデルファースト、Swaggerを全⾯採⽤
–  外部インターフェイスに注⼒
•  既存バックエンドのことはあまり考えない
パイロットプロジェクトの概要
•  サンドボックスの技術要素
– サーバ(API-GW):Apigee Edge (all in one)
– バックエンド:Node.js
– データストア:Apache UserGrid (NoSQL)
•  Swagger関連ツール
– Swagger Editer (編集)
– Swagger UI (API仕様公開、試⾏呼出)
– Swagger Node(A127) (API-FW , validation)
– Swagger2markup (PDFでのAPI仕様公開)
フェーズ1:API⾻格検討
•  最初はExcel等で整理(いきなりSwaggerは難しい)
– 業務機能洗い出し
– リソース抽出
– 項⽬名の名寄せ、英字検討
•  Swaggerは項⽬名だけ書く(詳細まで書かない)
– Path
– Operation
– 必須リクエストパラメータ
– 正常系のレスポンス
フェーズ2:サンドボックス構築
•  ⾻格が固まったら詳細記述
– 型(type, format ,pattern(正規表現))
– 必須、最⼩値、最⼤値,ENUM
– description等の説明の充実
– セキュリティ(OAuth関連)
– 共通化定義
– エラー定義
プロジェクトで気が付いたこと
(swagger関連のみ)
Swagger Editorについて(1/2)
•  とても使いやすい、わけではない
– ⼊⼒補助はあるが、賢くはない
– 構⽂エラーを取るのは⼀苦労
•  慣れないと指摘内容がわかりにくい
– 左右の画⾯移動が⼀⽅向のみ (左→右:NG)
•  気が付きにくい機能
– 「Ctrl + F」を2回で置換出来る
– Edit画⾯で階層で折りたためる
•  Swagger UIとの互換性は考えてない!?
Swagger Editorについて(2/2)
Swagger UIについて(1/2)
•  カスタマイズが必要
–  認証関係、バグパッチ対応、⽇本語化
–  修正は、基本index.html、jQueryでOK
•  表⽰されるレスポンスは、加⼯されている
–  CORSのXHRでのエラーは不明
–  304(Not Modified)は、200で表⽰
•  Chromeの開発画⾯を⾒たほうがいい
•  表⽰されないswaggerの情報がある
–  swaggerファイルも公開すべし
•  ベンダー拡張、内部APIはフィルタ
•  アルファベット順で必ずソートされる
–  apisSorter, operationsSorterは、1.2⽤記述?
Swagger UIについて(2/2)
Swagger Nodeについて
•  Swagger定義でフォーマットValidation、
単項⽬Validationしてくれるのはとても便利
•  リクエストだけでなく、レスポンスも
Validation可能、ただ、正常系もエラー系も
すべてValidationするのはすこし⼤変
–  additionalProperties:falseにするともっと⼤変
•  もちろん、リクエストのValidationエラーの
レスポンスがレスポンスvalidationエラーに
なることも
Swagger 仕様について(1/6)
•  全体の構成が分かりにくい
– リクエストとレスポンスが⾮対称
•  リクエストは、URIで送る情報、headerで送る情
報、bodyで送る情報をparametersに配列で定義
•  レスポンスは、ステータスコード、headerで受け
取る情報、bodyで受け取る情報をマップで定義
– 仕様書は、オブジェクトの参照関係のみ
•  Object構成図が欲しい!
オブジェクト
構成図
•  仕様書のObjectの
参照関係を階層
構造で定義	
•  $refの参照関係を
定義	
	
	
	
	
•  見えないし、分か
らないですよね。。
OpenAPI Specification Visual
Documentation
h,p://openapi-
specifica7on-visual-
documenta7on.apihandy
man.io/	
※誤記もあるので注意
Swagger 仕様について(4/6)
•  ⼤事な部分は、JSON Schema参照
– リクエストとレスポンスの項⽬定義について、
SwaggerとJSON Schemaのリファレンスを
両⽅みないとよくわからない。
•  オブジェクトの配列に注意
– 配列の識別⼦(“-”)とオブジェクトを別⾏に!
– 基本的にtagsとparameters、security、
allOf4つだけなので覚える!!
Swagger 仕様について(5/6)
•  “host”パラメータは、任意
– 書かなければ、ドキュメントのホスト
•  環境毎に書き換えなくていいので便利
– ただし、セキュリティ定義の(authorization
uri/token uri)は絶対URLで”host”とは無関係
•  PJでは、SwaggerUIをカスタマイズして、
descriptionを含めて、全てのURLをjQueryで⾃動
的に書き換えました
Swagger 仕様について(6/6)
•  レスポンスのエラー定義
– レスポンスの定義は、ステータスコード単位
– “400”で業務エラーを定義すると、業務エ
ラーコード等の定義が集中してしまう
– 業務エラーコードの情報をどこに書くか注意
•  Swaggerの外部に書くのもあり
–  ただし、externalDocsは、UIでは、表⽰されないので、
descriptionにリンクを書く
気が付いたこと(まとめ)
•  Swagger 仕様は結構難しい
•  Swagger EditorとUIで違う
•  Swagger UIは、カスタマイズが必要
•  内部⽤と外部⽤でSwaggerを分けたくなる
けど極⼒分けない(⽣成する)
Swagger仕様でよく悩むこと
定義の共通化について
•  Swaggerを書いていると、リクエストやレ
スポンス等に同⼀定義が繰り返し出てくる
•  これらを共通化するのが、Referenceオブ
ジェクト($ref)による参照である。
•  Swaggerの仕様では、Referenceオブジェク
トをさまざまな場所に記載できるが、少しわ
かりにくいので整理する。
•  外部ファイル参照については、取り上げない。
定義の共通化について
•  参照先の定義は3種類
–  Parameters Definitions
•  Parameterオブジェクトを定義
–  Responses Definitions
•  Responseオブジェクトを定義
–  (Schema) Definitions
•  Schemaオブジェクトを定義
•  Parameters,Responsesは⾃⾝参照出来ない
•  DefinitionsはDefinitionsは⾃⼰参照することが出来る
•  ただし、Alias的(直接$refする)な参照は⾮推奨?警告
が出る
•  responseのheaderの共⽤化は、出来ない
Parameters Definitions
•  参照元JSON Pointer
–  #/paths/{path}/parameters/0/$ref
–  #/paths/{path}/{method}/parameters/0/$ref
•  参照先JSON Pointer
– #/parameters/{name}
Parameters Definitions
#/	parameters	/{name}	
#/paths/{path}/parameters/0/$ref	
#/paths/{path}/{method}/parameters/0/$ref
Responses Definitions
•  参照元(JSON Pointer)
–  #/paths/{path}/{method}/responses/{StatusCode}/$ref
•  参照先(JSON Pointer)
– #/responses/{name}
Responses Definitions
#/	responses	/{name}	
#/paths/{path}/{method}/responses/{StatusCode}/$ref
(schema) Definitions
•  参照元ベースパス (Schema Object JSON Pointer)
–  #/paths/{path}/parameters/0/schema
–  #/paths/{path}/{method}/parameters/0/schema
–  #/paths/{path}/{method}/responses/{StatusCode}/schema
–  #/parameters/{name}/schema
–  #/responses/{name}/schema
–  #/definitions/{name}
•  参照元(JSON Pointer)
–  {参照元1}/$ref
–  {参照元1}/items/$ref
–  {参照元1}/properties/{property}/$ref
–  {参照元1}/properties/{property}/additionalProperties/$ref
–  {参照元1}/properties/{property}/allOf/0/$ref
•  参照先(JSON Pointer)
–  #/definitions/{name}
(schema) Definitions
#/paths/{path}/{method}/parameters/0/schema	
#/defini7ons/{name}
description等の説明⽂の記載
•  Swaggerは、API仕様ですので、定義だけでなく、
様々な説明書きを記載するが混乱しがちなので整
理
•  項⽬として"description"や"summary", "title"と
いう項⽬名があるが、GFM(GitHub Flavored
Markdown)が書けるのは、"description"だけで
す。
•  しかし、“description”でもGFMでない
(header,securityDefinition)ものもある
•  さらに、GFM対応と謳っているのにSwaggerUI
では、GFMとして処理されないものやそもそも表
⽰されない項⽬もある
!tle descrip!on JSON	pointer GFM Editor UI
アプリケーションのタ
イトル	
 	 #/info/7tle ☓	 ◯	 ◯	
アプリケーションの
説明	
アプリケーションの全体
に関する説明は、ここ
に記載する。	
#/info/descrip7on ◯	 ◯	 ◯	
拡張ドキュメントのリ
ソース	
Editorは、GFM表示し、
全体がURLのリンク。UI
はGFMの解釈はしない	
#/externalDocs/descrip7on ◯	 ◯	 △	
セキュリティ方式名	
Editorは常時画面に表
示、UIは、通常は表示
されず、authoriza7onボ
タンを押下した際のポッ
プアップモーダル画面
に表示	
#/securityDefini7on/{name}/descrip7on ☓	 ◯	 ◯	
OAuth2のスコープ名	 同上	 #/securityDefini7on/{name}/scopes/{name} ☓	 ◯	 ◯	
リソース操作をグ
ルーピング化するタ
グの説明	
EditorもUIもGFMの解釈
はしない。	
#/tags/0/descrip7on ◯	 △	 △	
拡張ドキュメントのリ
ソース	
EditorもUIも表示されな
い	
#/tags/0/externalDocs/descrip7on ◯	 ☓	 ☓	
説明⽂の対応状況(全体)
!tle descrip!on JSON	pointer (#/paths/{path}配下) GFM Editor UI
リソース操作の概要	  	 /{method}/summary ☓	 ◯	 ◯	
リソース操作の説明	  	 /{method}/descrip7on ◯	 ◯	 ◯	
リソース操作の拡張ド
キュメント説明	
UIもEditorも表示さ
れない。	
/{method}/externalDocs/descrip7on ◯	 ☓	 ☓	
URI単位のパラメータの
説明	
EditorもUIもGFMの
解釈はしない。	
/parameters/0/descrip7on	
/{method}/parameters/0/descrip7on
◯	 △	 △	
schemaのタイトル	  	
/parameters/0/schema/7tle	
/{method}/parameters/0/schema/7tle
☓	 ◯	 ◯	
schemaの説明	
Editorでは、GFM解
釈はされないが表
示される。UIでは表
示さない。
(JSONEditerでは、
GMF解釈されない
が表示される)
/parameters/0/schema/descrip7on	
/{method}/parameters/0/schema/descrip7on
◯	 △	 ☓	
schemaの拡張ドキュメン
ト説明	
UIもEditorも表示さ
れない。	
/parameters/0/schema/externalDocs/descrip7on	
/{method}/parameters/0/schema/externalDocs/descrip7on
◯	 ☓	 ☓	
プロパティ項目のタイト
ル	
 	
/parameters/0/schema/proper7es/{property}/7tle	
/{method}/parameters/0/schema/proper7es/{property}/7tle
☓	 ◯	 ◯	
プロパティ項目の説明	
Editorでは、GFM解
釈はされないが表
示される。UIでは表
示さない。(JSON	
Editorでは、GMF解
釈されないが表示
される)
/parameters/0/schema/proper7es/{property}/descrip7on	
/{method}/parameters/0/schema/proper7es/{property}/
descrip7on
◯	 △	 ☓	
説明⽂の対応状況(リクエスト)
!tle descrip!on JSON	pointer (#/paths/{path}配下) GFM Editor UI
ステータスコード単位の
レスポンスの説明	
 	 /{method}/responses/{StatusCode}/descrip7on ◯	 ◯	 ◯	
ヘダーの説明	
Header	objectの
descrip7onは、GFM
ではない。UI,Editer
共にGFM解釈もし
ない。	
/{method}/responses/{StatusCode}/headers/{headerName}/
descrip7on
☓	 ◯	 ◯	
スキーマタイトル	  	 /{method}/responses/{StatusCode}/schema/7tle ☓	 ◯	 ◯	
スキーマの説明	
Editorでは、GFM解
釈はされないが表
示される。UIでは表
示さない。	
/{method}/responses/{StatusCode}/schema/descrip7on ◯	 △	 ☓	
schemaの拡張ドキュメン
ト説明	
UIもEditorも表示さ
れない。	
/{method}/responses/{StatusCode}/schema/externalDocs/
descrip7on
◯	 ☓	 ☓	
プロパティ項目のタイト
ル	
 	
/{method}/responses/{StatusCode}/schema/proper7es/
{property}/7tle
☓	 ◯	 ◯	
プロパティ項目説明	
Editorでは、GFM解
釈はされないが表
示される。UIでは
GFM表示される。	
/{method}/responses/{StatusCode}/schema/proper7es/
{property}/descrip7on
◯	 △	 ◯	
説明⽂の対応状況(レスポンス)

More Related Content

What's hot

【de:code 2020】 Azure Red hat OpenShift (ARO) によるシステムアーキテクチャ構築の実践
【de:code 2020】 Azure Red hat OpenShift (ARO) によるシステムアーキテクチャ構築の実践【de:code 2020】 Azure Red hat OpenShift (ARO) によるシステムアーキテクチャ構築の実践
【de:code 2020】 Azure Red hat OpenShift (ARO) によるシステムアーキテクチャ構築の実践日本マイクロソフト株式会社
 
Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編Masahito Zembutsu
 
REST API のコツ
REST API のコツREST API のコツ
REST API のコツpospome
 
こんなに使える!今どきのAPIドキュメンテーションツール
こんなに使える!今どきのAPIドキュメンテーションツールこんなに使える!今どきのAPIドキュメンテーションツール
こんなに使える!今どきのAPIドキュメンテーションツールdcubeio
 
Swagger ではない OpenAPI Specification 3.0 による API サーバー開発
Swagger ではない OpenAPI Specification 3.0 による API サーバー開発Swagger ではない OpenAPI Specification 3.0 による API サーバー開発
Swagger ではない OpenAPI Specification 3.0 による API サーバー開発Yahoo!デベロッパーネットワーク
 
大規模環境でRailsと4年間付き合ってきて@ クックパッド * 食べログ合同勉強会
大規模環境でRailsと4年間付き合ってきて@ クックパッド * 食べログ合同勉強会大規模環境でRailsと4年間付き合ってきて@ クックパッド * 食べログ合同勉強会
大規模環境でRailsと4年間付き合ってきて@ クックパッド * 食べログ合同勉強会Takayuki Kyowa
 
マルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのことマルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのことAmazon Web Services Japan
 
基礎からのOAuth 2.0とSpring Security 5.1による実装
基礎からのOAuth 2.0とSpring Security 5.1による実装基礎からのOAuth 2.0とSpring Security 5.1による実装
基礎からのOAuth 2.0とSpring Security 5.1による実装Masatoshi Tada
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Akihiro Suda
 
Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Taku Miyakawa
 
ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方増田 亨
 
OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話
OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話
OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話Daichi Koike
 
RESTful Web アプリの設計レビューの話
RESTful Web アプリの設計レビューの話RESTful Web アプリの設計レビューの話
RESTful Web アプリの設計レビューの話Takuto Wada
 
Azure API Management 俺的マニュアル
Azure API Management 俺的マニュアルAzure API Management 俺的マニュアル
Azure API Management 俺的マニュアル貴志 上坂
 
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャーKubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャーToru Makabe
 
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話JustSystems Corporation
 
マルチテナントのアプリケーション実装〜実践編〜
マルチテナントのアプリケーション実装〜実践編〜マルチテナントのアプリケーション実装〜実践編〜
マルチテナントのアプリケーション実装〜実践編〜Yoshiki Nakagawa
 
その Pod 突然落ちても大丈夫ですか!?(OCHaCafe5 #5 実験!カオスエンジニアリング 発表資料)
その Pod 突然落ちても大丈夫ですか!?(OCHaCafe5 #5 実験!カオスエンジニアリング 発表資料)その Pod 突然落ちても大丈夫ですか!?(OCHaCafe5 #5 実験!カオスエンジニアリング 発表資料)
その Pod 突然落ちても大丈夫ですか!?(OCHaCafe5 #5 実験!カオスエンジニアリング 発表資料)NTT DATA Technology & Innovation
 

What's hot (20)

【de:code 2020】 Azure Red hat OpenShift (ARO) によるシステムアーキテクチャ構築の実践
【de:code 2020】 Azure Red hat OpenShift (ARO) によるシステムアーキテクチャ構築の実践【de:code 2020】 Azure Red hat OpenShift (ARO) によるシステムアーキテクチャ構築の実践
【de:code 2020】 Azure Red hat OpenShift (ARO) によるシステムアーキテクチャ構築の実践
 
Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編
 
REST API のコツ
REST API のコツREST API のコツ
REST API のコツ
 
こんなに使える!今どきのAPIドキュメンテーションツール
こんなに使える!今どきのAPIドキュメンテーションツールこんなに使える!今どきのAPIドキュメンテーションツール
こんなに使える!今どきのAPIドキュメンテーションツール
 
Swagger ではない OpenAPI Specification 3.0 による API サーバー開発
Swagger ではない OpenAPI Specification 3.0 による API サーバー開発Swagger ではない OpenAPI Specification 3.0 による API サーバー開発
Swagger ではない OpenAPI Specification 3.0 による API サーバー開発
 
大規模環境でRailsと4年間付き合ってきて@ クックパッド * 食べログ合同勉強会
大規模環境でRailsと4年間付き合ってきて@ クックパッド * 食べログ合同勉強会大規模環境でRailsと4年間付き合ってきて@ クックパッド * 食べログ合同勉強会
大規模環境でRailsと4年間付き合ってきて@ クックパッド * 食べログ合同勉強会
 
分散トレーシング技術について(Open tracingやjaeger)
分散トレーシング技術について(Open tracingやjaeger)分散トレーシング技術について(Open tracingやjaeger)
分散トレーシング技術について(Open tracingやjaeger)
 
ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開
 
マルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのことマルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのこと
 
基礎からのOAuth 2.0とSpring Security 5.1による実装
基礎からのOAuth 2.0とSpring Security 5.1による実装基礎からのOAuth 2.0とSpring Security 5.1による実装
基礎からのOAuth 2.0とSpring Security 5.1による実装
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 
Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方
 
ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方
 
OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話
OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話
OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話
 
RESTful Web アプリの設計レビューの話
RESTful Web アプリの設計レビューの話RESTful Web アプリの設計レビューの話
RESTful Web アプリの設計レビューの話
 
Azure API Management 俺的マニュアル
Azure API Management 俺的マニュアルAzure API Management 俺的マニュアル
Azure API Management 俺的マニュアル
 
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャーKubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
 
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
 
マルチテナントのアプリケーション実装〜実践編〜
マルチテナントのアプリケーション実装〜実践編〜マルチテナントのアプリケーション実装〜実践編〜
マルチテナントのアプリケーション実装〜実践編〜
 
その Pod 突然落ちても大丈夫ですか!?(OCHaCafe5 #5 実験!カオスエンジニアリング 発表資料)
その Pod 突然落ちても大丈夫ですか!?(OCHaCafe5 #5 実験!カオスエンジニアリング 発表資料)その Pod 突然落ちても大丈夫ですか!?(OCHaCafe5 #5 実験!カオスエンジニアリング 発表資料)
その Pod 突然落ちても大丈夫ですか!?(OCHaCafe5 #5 実験!カオスエンジニアリング 発表資料)
 

Viewers also liked

Swaggerで始めるモデルファーストなAPI開発
Swaggerで始めるモデルファーストなAPI開発Swaggerで始めるモデルファーストなAPI開発
Swaggerで始めるモデルファーストなAPI開発Takuro Sasaki
 
脱RESTful API設計の提案
脱RESTful API設計の提案脱RESTful API設計の提案
脱RESTful API設計の提案樽八 仲川
 
Operations: Production Readiness Review – How to stop bad things from Happening
Operations: Production Readiness Review – How to stop bad things from HappeningOperations: Production Readiness Review – How to stop bad things from Happening
Operations: Production Readiness Review – How to stop bad things from HappeningAmazon Web Services
 
golang.tokyo #6 (in Japanese)
golang.tokyo #6 (in Japanese)golang.tokyo #6 (in Japanese)
golang.tokyo #6 (in Japanese)Yuichi Murata
 
Streaming Data Analytics with Amazon Redshift and Kinesis Firehose
Streaming Data Analytics with Amazon Redshift and Kinesis FirehoseStreaming Data Analytics with Amazon Redshift and Kinesis Firehose
Streaming Data Analytics with Amazon Redshift and Kinesis FirehoseAmazon Web Services
 
MongoDBの可能性の話
MongoDBの可能性の話MongoDBの可能性の話
MongoDBの可能性の話Akihiro Kuwano
 
Apache Spark Streaming + Kafka 0.10 with Joan Viladrosariera
Apache Spark Streaming + Kafka 0.10 with Joan ViladrosarieraApache Spark Streaming + Kafka 0.10 with Joan Viladrosariera
Apache Spark Streaming + Kafka 0.10 with Joan ViladrosarieraSpark Summit
 
AWS X-Rayによるアプリケーションの分析とデバッグ
AWS X-Rayによるアプリケーションの分析とデバッグAWS X-Rayによるアプリケーションの分析とデバッグ
AWS X-Rayによるアプリケーションの分析とデバッグAmazon Web Services Japan
 
Spiderストレージエンジンの使い方と利用事例 他ストレージエンジンの紹介
Spiderストレージエンジンの使い方と利用事例 他ストレージエンジンの紹介Spiderストレージエンジンの使い方と利用事例 他ストレージエンジンの紹介
Spiderストレージエンジンの使い方と利用事例 他ストレージエンジンの紹介Kentoku
 
ScalaからGoへ
ScalaからGoへScalaからGoへ
ScalaからGoへJames Neve
 
An introduction and future of Ruby coverage library
An introduction and future of Ruby coverage libraryAn introduction and future of Ruby coverage library
An introduction and future of Ruby coverage librarymametter
 
神に近づくx/net/context (Finding God with x/net/context)
神に近づくx/net/context (Finding God with x/net/context)神に近づくx/net/context (Finding God with x/net/context)
神に近づくx/net/context (Finding God with x/net/context)guregu
 
AndApp開発における全て #denatechcon
AndApp開発における全て #denatechconAndApp開発における全て #denatechcon
AndApp開発における全て #denatechconDeNA
 
Fast and Reliable Swift APIs with gRPC
Fast and Reliable Swift APIs with gRPCFast and Reliable Swift APIs with gRPC
Fast and Reliable Swift APIs with gRPCTim Burks
 
メルカリアッテの実務で使えた、GAE/Goの開発を効率的にする方法
メルカリアッテの実務で使えた、GAE/Goの開発を効率的にする方法メルカリアッテの実務で使えた、GAE/Goの開発を効率的にする方法
メルカリアッテの実務で使えた、GAE/Goの開発を効率的にする方法Takuya Ueda
 
So You Wanna Go Fast?
So You Wanna Go Fast?So You Wanna Go Fast?
So You Wanna Go Fast?Tyler Treat
 

Viewers also liked (20)

Swaggerで始めるモデルファーストなAPI開発
Swaggerで始めるモデルファーストなAPI開発Swaggerで始めるモデルファーストなAPI開発
Swaggerで始めるモデルファーストなAPI開発
 
脱RESTful API設計の提案
脱RESTful API設計の提案脱RESTful API設計の提案
脱RESTful API設計の提案
 
Operations: Production Readiness Review – How to stop bad things from Happening
Operations: Production Readiness Review – How to stop bad things from HappeningOperations: Production Readiness Review – How to stop bad things from Happening
Operations: Production Readiness Review – How to stop bad things from Happening
 
golang.tokyo #6 (in Japanese)
golang.tokyo #6 (in Japanese)golang.tokyo #6 (in Japanese)
golang.tokyo #6 (in Japanese)
 
SLOのすすめ
SLOのすすめSLOのすすめ
SLOのすすめ
 
Streaming Data Analytics with Amazon Redshift and Kinesis Firehose
Streaming Data Analytics with Amazon Redshift and Kinesis FirehoseStreaming Data Analytics with Amazon Redshift and Kinesis Firehose
Streaming Data Analytics with Amazon Redshift and Kinesis Firehose
 
MongoDBの可能性の話
MongoDBの可能性の話MongoDBの可能性の話
MongoDBの可能性の話
 
Apache Spark Streaming + Kafka 0.10 with Joan Viladrosariera
Apache Spark Streaming + Kafka 0.10 with Joan ViladrosarieraApache Spark Streaming + Kafka 0.10 with Joan Viladrosariera
Apache Spark Streaming + Kafka 0.10 with Joan Viladrosariera
 
AWS X-Rayによるアプリケーションの分析とデバッグ
AWS X-Rayによるアプリケーションの分析とデバッグAWS X-Rayによるアプリケーションの分析とデバッグ
AWS X-Rayによるアプリケーションの分析とデバッグ
 
What’s New in Amazon Aurora
What’s New in Amazon AuroraWhat’s New in Amazon Aurora
What’s New in Amazon Aurora
 
Spiderストレージエンジンの使い方と利用事例 他ストレージエンジンの紹介
Spiderストレージエンジンの使い方と利用事例 他ストレージエンジンの紹介Spiderストレージエンジンの使い方と利用事例 他ストレージエンジンの紹介
Spiderストレージエンジンの使い方と利用事例 他ストレージエンジンの紹介
 
Blockchain on Go
Blockchain on GoBlockchain on Go
Blockchain on Go
 
ScalaからGoへ
ScalaからGoへScalaからGoへ
ScalaからGoへ
 
An introduction and future of Ruby coverage library
An introduction and future of Ruby coverage libraryAn introduction and future of Ruby coverage library
An introduction and future of Ruby coverage library
 
神に近づくx/net/context (Finding God with x/net/context)
神に近づくx/net/context (Finding God with x/net/context)神に近づくx/net/context (Finding God with x/net/context)
神に近づくx/net/context (Finding God with x/net/context)
 
AndApp開発における全て #denatechcon
AndApp開発における全て #denatechconAndApp開発における全て #denatechcon
AndApp開発における全て #denatechcon
 
Microservices at Mercari
Microservices at MercariMicroservices at Mercari
Microservices at Mercari
 
Fast and Reliable Swift APIs with gRPC
Fast and Reliable Swift APIs with gRPCFast and Reliable Swift APIs with gRPC
Fast and Reliable Swift APIs with gRPC
 
メルカリアッテの実務で使えた、GAE/Goの開発を効率的にする方法
メルカリアッテの実務で使えた、GAE/Goの開発を効率的にする方法メルカリアッテの実務で使えた、GAE/Goの開発を効率的にする方法
メルカリアッテの実務で使えた、GAE/Goの開発を効率的にする方法
 
So You Wanna Go Fast?
So You Wanna Go Fast?So You Wanna Go Fast?
So You Wanna Go Fast?
 

Similar to Swaggerでのapi開発よもやま話

RESTとRailsスタイル
RESTとRailsスタイルRESTとRailsスタイル
RESTとRailsスタイルToru Kawamura
 
Spring data-rest-and-spring-cloud-contract
Spring data-rest-and-spring-cloud-contractSpring data-rest-and-spring-cloud-contract
Spring data-rest-and-spring-cloud-contractTakeshi Ogawa
 
もっとはじめる Ember.js !! ~ Getting started with Ember.js more ~
もっとはじめる Ember.js !! ~ Getting started with Ember.js more ~もっとはじめる Ember.js !! ~ Getting started with Ember.js more ~
もっとはじめる Ember.js !! ~ Getting started with Ember.js more ~Ryunosuke SATO
 
Rails解説セミナー: Rails国際化 (I18n) API
Rails解説セミナー: Rails国際化 (I18n) APIRails解説セミナー: Rails国際化 (I18n) API
Rails解説セミナー: Rails国際化 (I18n) APIYohei Yasukawa
 
Meetup11 contacts api読んでみた
Meetup11 contacts api読んでみたMeetup11 contacts api読んでみた
Meetup11 contacts api読んでみたMasami Yabushita
 
Tokyowebmining5 yokkuns
Tokyowebmining5 yokkunsTokyowebmining5 yokkuns
Tokyowebmining5 yokkunsYohei Sato
 
初めてのPadrino
初めてのPadrino初めてのPadrino
初めてのPadrinoTakeshi Yabe
 
Scalaでプログラムを作りました
Scalaでプログラムを作りましたScalaでプログラムを作りました
Scalaでプログラムを作りましたTomoharu ASAMI
 
リソースフレームワークBEARのススメ(PHP勉強会#51)
リソースフレームワークBEARのススメ(PHP勉強会#51)リソースフレームワークBEARのススメ(PHP勉強会#51)
リソースフレームワークBEARのススメ(PHP勉強会#51)stellaqua
 
laravel x モバイルアプリ
laravel x モバイルアプリlaravel x モバイルアプリ
laravel x モバイルアプリMasaki Oshikawa
 
[出張!雲勉 in Tokyo] Swagger で簡単APIドキュメント作成
[出張!雲勉 in Tokyo] Swagger で簡単APIドキュメント作成[出張!雲勉 in Tokyo] Swagger で簡単APIドキュメント作成
[出張!雲勉 in Tokyo] Swagger で簡単APIドキュメント作成Tomoki Oyamatsu
 
Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework
Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframeworkSpring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework
Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframeworkToshiaki Maki
 
マイクロサービスにおけるクエリー言語について
マイクロサービスにおけるクエリー言語についてマイクロサービスにおけるクエリー言語について
マイクロサービスにおけるクエリー言語についてsz yudppp
 
[Japanese] Skinny Framework で始める Scala #jjug_ccc #ccc_r24
[Japanese] Skinny Framework で始める Scala #jjug_ccc #ccc_r24[Japanese] Skinny Framework で始める Scala #jjug_ccc #ccc_r24
[Japanese] Skinny Framework で始める Scala #jjug_ccc #ccc_r24Kazuhiro Sera
 
Django/Celeyを用いたデータ分析Webアプリケーションにおける非同期処理の設計と実装
Django/Celeyを用いたデータ分析Webアプリケーションにおける非同期処理の設計と実装Django/Celeyを用いたデータ分析Webアプリケーションにおける非同期処理の設計と実装
Django/Celeyを用いたデータ分析Webアプリケーションにおける非同期処理の設計と実装Satoshi Nagayasu
 
ApplicationTemplateのススメ
ApplicationTemplateのススメApplicationTemplateのススメ
ApplicationTemplateのススメTakafumi ONAKA
 
capybara で快適なテスト生活を
capybara で快適なテスト生活をcapybara で快適なテスト生活を
capybara で快適なテスト生活をRyunosuke SATO
 
Alfresco勉強会#36 alfresco 5でカスタムREST APIを作ってみよう
Alfresco勉強会#36 alfresco 5でカスタムREST APIを作ってみようAlfresco勉強会#36 alfresco 5でカスタムREST APIを作ってみよう
Alfresco勉強会#36 alfresco 5でカスタムREST APIを作ってみようTasuku Otani
 
Rails初心者レッスン lesson1 3rd edition
Rails初心者レッスン lesson1 3rd editionRails初心者レッスン lesson1 3rd edition
Rails初心者レッスン lesson1 3rd editionGoh Matsumoto
 
JSON Schema と API テスト YAPC::Asia Tokyo 2014
JSON Schema と API テスト YAPC::Asia Tokyo 2014JSON Schema と API テスト YAPC::Asia Tokyo 2014
JSON Schema と API テスト YAPC::Asia Tokyo 2014Naoki Shimizu
 

Similar to Swaggerでのapi開発よもやま話 (20)

RESTとRailsスタイル
RESTとRailsスタイルRESTとRailsスタイル
RESTとRailsスタイル
 
Spring data-rest-and-spring-cloud-contract
Spring data-rest-and-spring-cloud-contractSpring data-rest-and-spring-cloud-contract
Spring data-rest-and-spring-cloud-contract
 
もっとはじめる Ember.js !! ~ Getting started with Ember.js more ~
もっとはじめる Ember.js !! ~ Getting started with Ember.js more ~もっとはじめる Ember.js !! ~ Getting started with Ember.js more ~
もっとはじめる Ember.js !! ~ Getting started with Ember.js more ~
 
Rails解説セミナー: Rails国際化 (I18n) API
Rails解説セミナー: Rails国際化 (I18n) APIRails解説セミナー: Rails国際化 (I18n) API
Rails解説セミナー: Rails国際化 (I18n) API
 
Meetup11 contacts api読んでみた
Meetup11 contacts api読んでみたMeetup11 contacts api読んでみた
Meetup11 contacts api読んでみた
 
Tokyowebmining5 yokkuns
Tokyowebmining5 yokkunsTokyowebmining5 yokkuns
Tokyowebmining5 yokkuns
 
初めてのPadrino
初めてのPadrino初めてのPadrino
初めてのPadrino
 
Scalaでプログラムを作りました
Scalaでプログラムを作りましたScalaでプログラムを作りました
Scalaでプログラムを作りました
 
リソースフレームワークBEARのススメ(PHP勉強会#51)
リソースフレームワークBEARのススメ(PHP勉強会#51)リソースフレームワークBEARのススメ(PHP勉強会#51)
リソースフレームワークBEARのススメ(PHP勉強会#51)
 
laravel x モバイルアプリ
laravel x モバイルアプリlaravel x モバイルアプリ
laravel x モバイルアプリ
 
[出張!雲勉 in Tokyo] Swagger で簡単APIドキュメント作成
[出張!雲勉 in Tokyo] Swagger で簡単APIドキュメント作成[出張!雲勉 in Tokyo] Swagger で簡単APIドキュメント作成
[出張!雲勉 in Tokyo] Swagger で簡単APIドキュメント作成
 
Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework
Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframeworkSpring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework
Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework
 
マイクロサービスにおけるクエリー言語について
マイクロサービスにおけるクエリー言語についてマイクロサービスにおけるクエリー言語について
マイクロサービスにおけるクエリー言語について
 
[Japanese] Skinny Framework で始める Scala #jjug_ccc #ccc_r24
[Japanese] Skinny Framework で始める Scala #jjug_ccc #ccc_r24[Japanese] Skinny Framework で始める Scala #jjug_ccc #ccc_r24
[Japanese] Skinny Framework で始める Scala #jjug_ccc #ccc_r24
 
Django/Celeyを用いたデータ分析Webアプリケーションにおける非同期処理の設計と実装
Django/Celeyを用いたデータ分析Webアプリケーションにおける非同期処理の設計と実装Django/Celeyを用いたデータ分析Webアプリケーションにおける非同期処理の設計と実装
Django/Celeyを用いたデータ分析Webアプリケーションにおける非同期処理の設計と実装
 
ApplicationTemplateのススメ
ApplicationTemplateのススメApplicationTemplateのススメ
ApplicationTemplateのススメ
 
capybara で快適なテスト生活を
capybara で快適なテスト生活をcapybara で快適なテスト生活を
capybara で快適なテスト生活を
 
Alfresco勉強会#36 alfresco 5でカスタムREST APIを作ってみよう
Alfresco勉強会#36 alfresco 5でカスタムREST APIを作ってみようAlfresco勉強会#36 alfresco 5でカスタムREST APIを作ってみよう
Alfresco勉強会#36 alfresco 5でカスタムREST APIを作ってみよう
 
Rails初心者レッスン lesson1 3rd edition
Rails初心者レッスン lesson1 3rd editionRails初心者レッスン lesson1 3rd edition
Rails初心者レッスン lesson1 3rd edition
 
JSON Schema と API テスト YAPC::Asia Tokyo 2014
JSON Schema と API テスト YAPC::Asia Tokyo 2014JSON Schema と API テスト YAPC::Asia Tokyo 2014
JSON Schema と API テスト YAPC::Asia Tokyo 2014
 

Swaggerでのapi開発よもやま話

Editor's Notes

  1. 入社12年目のいわゆるSEです。金融系のお客様のシステム構築や保守を主に行ってきました。 技術的には、XMLが好きで、業務システムにXML DBが採用されることを夢見てました。 もう8年も前ですがXML DBプログラミングコンテストというニッチなコンテストで最優秀賞をもらいました。 最近では、Startup Weekend Fintechで、ソーシャルレンディングのチームに参加してMVPを作成し優勝しました。
  2. ※ここでお断りしてさせて頂きますが、今回のご紹介する取り組みは、現在進行中の話もあり具体的な案件の内容やAPIの仕様についてお見せできないことをご了承ください。 その代わりと言ってなんですが、Redmine のAPIをSwaggerに起こしてみましたのでSwaggerファイルのサンプルをご覧頂く際には、そちらをお見せします。→ たぶんGitHubに上げます。
  3. その後、サンドボックスの構築を開始しましたが、ここでは、バックエンドの業務処理実装とSwaggerの詳細記述を並行して行いました。Swaggerの精緻記述とは、各パラメータの型や桁数、正規表現による文字列形式最大値、最小値の定義、ENUMの定義やOAuthのセキュリティ記述やエラーのステータス定義やエラーのレスポンス定義、業務エラーコードの記載などを行って行きました。「モデルファースト」でない感じもしますが、サンドボックスの実装に依存する記載もありますし、最初からすべてのSwagger定義を記載するのは難しと感じています。なお、status:400で同一の構造である必要がある為、Swagger-toolsのエラーレスポンスは再編集するようにしました。
  4. SwaggerUIは、カスタマイズがだいたい必要、基本はindex.htmlを治すだけ。jQueryを使ったことがあれば十分出来る。 認証関係のカスタマイズは、結構面倒 swaggerUIにbasic認証をかけるて、OAuth認証すると再読み込みで使えない。 tagsを複数定義すると、tagごとに整理されて重複表示される。 SwaggerUIは日本語化が出来る。翻訳対象項目には、辞書があるので、対訳を修正することで表示文言を変えられる。 制約値(minimam valueなど)が表示されない、これは結構辛かった。ポップアップで表示されるようになったが、 どの項目のポップアップかかわならいので、項目名を表示されるように修正した。 API利用者には、UIだけでなく、swaggerファイルを提供したほうが、コピペなどをする際に便利かもしれない。 ただし、共通化を進めているとswaggerファイルを見ても最終的な構造はわかりにくいかも swaggerファイル自体も公開すべき
  5. SwaggerUIは、カスタマイズがだいたい必要、基本はindex.htmlを治すだけ。jQueryを使ったことがあれば十分出来る。 認証関係のカスタマイズは、結構面倒 swaggerUIにbasic認証をかけるて、OAuth認証すると再読み込みで使えない。 tagsを複数定義すると、tagごとに整理されて重複表示される。 SwaggerUIは日本語化が出来る。翻訳対象項目には、辞書があるので、対訳を修正することで表示文言を変えられる。 制約値(minimam valueなど)が表示されない、これは結構辛かった。ポップアップで表示されるようになったが、 どの項目のポップアップかかわならいので、項目名を表示されるように修正した。 API利用者には、UIだけでなく、swaggerファイルを提供したほうが、コピペなどをする際に便利かもしれない。 ただし、共通化を進めているとswaggerファイルを見ても最終的な構造はわかりにくいかも swaggerファイル自体も公開すべき
  6. YAMLはネスト構造で見やすいが、オブジェクトの配列は、非常に見づらく、 オブジェクトの配列は、見づらい、配列の - を空行として、次の行に書くべき hostパラメータは、書かなければ、ドキュメントのカレントhostを示すので 単体環境、試験環境、本番環境で切り替えを行う場合はあえて書かないほうが良いかもしれません。 ただし、authorization uri/token uriは、hostパラメータに依存しないので、 何らか対策が必要ですね。私は、swagger UIのクライアント上で切り替えていました。 1ソースマルチユースを実現するのは、結構たいへんです。 だいたい、内部用と外部用に分けたくなります。 これは、x-のベンダープリフィックスもそうですし、バックエンド上で内部用のAPIと外部用のAPIの 両方の実装を行い、API-GWなどでセキュリティ設定を行った場合、 swagger上に公開したいものと、したくないものが混在するケースがあると思います。 キーベースでのfilter機能を使って同一機能を利用しました。 大量の業務エラーのコードを書くのは辛い。別に一覧を書くべきかもしれない。
  7. また、YAMLで記載している場合特に オブジェクトと配列がわかりにくくなる。オブジェクトの配列については、配列の識別子("-")と先頭のオブジェクトを同一行に書かずに識別子だけを一行目に書き、二行目以降にオブジェクトを並べるのもありかもしれない。parameters: - in: query name: offset type: integer - in: query name: limit type: integerparameters: - in: query name: offset type: integer - in: query name: limit type: integerまた、swaggerで配列のオブジェクトになるのは、tagsとparametersとsecurityだけなので、覚えてしまうのもありかもしれない。
  8. YAMLはネスト構造で見やすいが、オブジェクトの配列は、非常に見づらく、 オブジェクトの配列は、見づらい、配列の - を空行として、次の行に書くべき hostパラメータは、書かなければ、ドキュメントのカレントhostを示すので 単体環境、試験環境、本番環境で切り替えを行う場合はあえて書かないほうが良いかもしれません。 ただし、authorization uri/token uriは、hostパラメータに依存しないので、 何らか対策が必要ですね。私は、swagger UIのクライアント上で切り替えていました。 1ソースマルチユースを実現するのは、結構たいへんです。 だいたい、内部用と外部用に分けたくなります。 これは、x-のベンダープリフィックスもそうですし、バックエンド上で内部用のAPIと外部用のAPIの 両方の実装を行い、API-GWなどでセキュリティ設定を行った場合、 swagger上に公開したいものと、したくないものが混在するケースがあると思います。 キーベースでのfilter機能を使って同一機能を利用しました。 大量の業務エラーのコードを書くのは辛い。別に一覧を書くべきかもしれない。
  9. YAMLはネスト構造で見やすいが、オブジェクトの配列は、非常に見づらく、 オブジェクトの配列は、見づらい、配列の - を空行として、次の行に書くべき hostパラメータは、書かなければ、ドキュメントのカレントhostを示すので 単体環境、試験環境、本番環境で切り替えを行う場合はあえて書かないほうが良いかもしれません。 ただし、authorization uri/token uriは、hostパラメータに依存しないので、 何らか対策が必要ですね。私は、swagger UIのクライアント上で切り替えていました。 1ソースマルチユースを実現するのは、結構たいへんです。 だいたい、内部用と外部用に分けたくなります。 これは、x-のベンダープリフィックスもそうですし、バックエンド上で内部用のAPIと外部用のAPIの 両方の実装を行い、API-GWなどでセキュリティ設定を行った場合、 swagger上に公開したいものと、したくないものが混在するケースがあると思います。 キーベースでのfilter機能を使って同一機能を利用しました。 大量の業務エラーのコードを書くのは辛い。別に一覧を書くべきかもしれない。
  10. Swaggerを書いていると、リクエストやレスポンス等に同一定義が繰り返し出てくる。 これらを共通化するのが、Referenceオブジェクト($ref)による参照である。 Swaggerの仕様では、Referenceオブジェクトを継承して新たなReferenceオブジェクトを 定義することが出来るなど、さまざまな機能があるが、少しわかりにくいので 整理する。 ・参照先は3種類、Parameters,Responses,Definitions ・Parameters,Responsesは自身を参照することは出来ない。Definitionsへの参照は可能。 ・DefinitionsはDefinitionsを参照することが出来る。ただし、Alias的(直接$refする)な参照は警告が出る。 ・responseのheaderの参照共用化は、出来ない。 ■Parameters Definitionsオブジェクト参照 #/paths/{path}/parameters/0/$ref #/paths/{path}/{method}/parameters/0/$ref → #/parameters/{name} (Parameterオブジェクトを定義) ■Responses Definitionsオブジェクト参照 #/paths/{path}/{method}/responses/{StatusCode}/$ref → #/responses/{name} (Responseオブジェクトを定義) ■Definitionsオブジェクト参照 #/paths/{path}/parameters/0/schema #/paths/{path}/{method}/parameters/0/schema #/paths/{path}/{method}/responses/{StatusCode}/schema #/parameters/{name}/schema #/responses/{name}/schema #/definitions/{name} /$ref /items/$ref /properties/{property}/$ref /properties/{property}/additionalProperties/$ref /properties/{property}/allOf/0/$ref → #/definitions/{name} Schemaオブジェクトを定義 ※{method}=get|put|post|delete|options|head|patch ■外部ファイル(YAML,JSON)参照 #/paths/{path}/$ref: '{path}.yaml' ※外部YAML,JSON参照
  11. Swaggerを書いていると、リクエストやレスポンス等に同一定義が繰り返し出てくる。 これらを共通化するのが、Referenceオブジェクト($ref)による参照である。 Swaggerの仕様では、Referenceオブジェクトを継承して新たなReferenceオブジェクトを 定義することが出来るなど、さまざまな機能があるが、少しわかりにくいので 整理する。 ・参照先は3種類、Parameters,Responses,Definitions ・Parameters,Responsesは自身を参照することは出来ない。Definitionsへの参照は可能。 ・DefinitionsはDefinitionsを参照することが出来る。ただし、Alias的(直接$refする)な参照は警告が出る。 ・responseのheaderの参照共用化は、出来ない。 ■Parameters Definitionsオブジェクト参照 #/paths/{path}/parameters/0/$ref #/paths/{path}/{method}/parameters/0/$ref → #/parameters/{name} (Parameterオブジェクトを定義) ■Responses Definitionsオブジェクト参照 #/paths/{path}/{method}/responses/{StatusCode}/$ref → #/responses/{name} (Responseオブジェクトを定義) ■Definitionsオブジェクト参照 #/paths/{path}/parameters/0/schema #/paths/{path}/{method}/parameters/0/schema #/paths/{path}/{method}/responses/{StatusCode}/schema #/parameters/{name}/schema #/responses/{name}/schema #/definitions/{name} /$ref /items/$ref /properties/{property}/$ref /properties/{property}/additionalProperties/$ref /properties/{property}/allOf/0/$ref → #/definitions/{name} Schemaオブジェクトを定義 ※{method}=get|put|post|delete|options|head|patch ■外部ファイル(YAML,JSON)参照 #/paths/{path}/$ref: '{path}.yaml' ※外部YAML,JSON参照
  12. Swaggerを書いていると、リクエストやレスポンス等に同一定義が繰り返し出てくる。 これらを共通化するのが、Referenceオブジェクト($ref)による参照である。 Swaggerの仕様では、Referenceオブジェクトを継承して新たなReferenceオブジェクトを 定義することが出来るなど、さまざまな機能があるが、少しわかりにくいので 整理する。 ・参照先は3種類、Parameters,Responses,Definitions ・Parameters,Responsesは自身を参照することは出来ない。Definitionsへの参照は可能。 ・DefinitionsはDefinitionsを参照することが出来る。ただし、Alias的(直接$refする)な参照は警告が出る。 ・responseのheaderの参照共用化は、出来ない。 ■Parameters Definitionsオブジェクト参照 #/paths/{path}/parameters/0/$ref #/paths/{path}/{method}/parameters/0/$ref → #/parameters/{name} (Parameterオブジェクトを定義) ■Responses Definitionsオブジェクト参照 #/paths/{path}/{method}/responses/{StatusCode}/$ref → #/responses/{name} (Responseオブジェクトを定義) ■Definitionsオブジェクト参照 #/paths/{path}/parameters/0/schema #/paths/{path}/{method}/parameters/0/schema #/paths/{path}/{method}/responses/{StatusCode}/schema #/parameters/{name}/schema #/responses/{name}/schema #/definitions/{name} /$ref /items/$ref /properties/{property}/$ref /properties/{property}/additionalProperties/$ref /properties/{property}/allOf/0/$ref → #/definitions/{name} Schemaオブジェクトを定義 ※{method}=get|put|post|delete|options|head|patch ■外部ファイル(YAML,JSON)参照 #/paths/{path}/$ref: '{path}.yaml' ※外部YAML,JSON参照
  13. Swaggerを書いていると、リクエストやレスポンス等に同一定義が繰り返し出てくる。 これらを共通化するのが、Referenceオブジェクト($ref)による参照である。 Swaggerの仕様では、Referenceオブジェクトを継承して新たなReferenceオブジェクトを 定義することが出来るなど、さまざまな機能があるが、少しわかりにくいので 整理する。 ・参照先は3種類、Parameters,Responses,Definitions ・Parameters,Responsesは自身を参照することは出来ない。Definitionsへの参照は可能。 ・DefinitionsはDefinitionsを参照することが出来る。ただし、Alias的(直接$refする)な参照は警告が出る。 ・responseのheaderの参照共用化は、出来ない。 ■Parameters Definitionsオブジェクト参照 #/paths/{path}/parameters/0/$ref #/paths/{path}/{method}/parameters/0/$ref → #/parameters/{name} (Parameterオブジェクトを定義) ■Responses Definitionsオブジェクト参照 #/paths/{path}/{method}/responses/{StatusCode}/$ref → #/responses/{name} (Responseオブジェクトを定義) ■Definitionsオブジェクト参照 #/paths/{path}/parameters/0/schema #/paths/{path}/{method}/parameters/0/schema #/paths/{path}/{method}/responses/{StatusCode}/schema #/parameters/{name}/schema #/responses/{name}/schema #/definitions/{name} /$ref /items/$ref /properties/{property}/$ref /properties/{property}/additionalProperties/$ref /properties/{property}/allOf/0/$ref → #/definitions/{name} Schemaオブジェクトを定義 ※{method}=get|put|post|delete|options|head|patch ■外部ファイル(YAML,JSON)参照 #/paths/{path}/$ref: '{path}.yaml' ※外部YAML,JSON参照
  14. Swaggerを書いていると、リクエストやレスポンス等に同一定義が繰り返し出てくる。 これらを共通化するのが、Referenceオブジェクト($ref)による参照である。 Swaggerの仕様では、Referenceオブジェクトを継承して新たなReferenceオブジェクトを 定義することが出来るなど、さまざまな機能があるが、少しわかりにくいので 整理する。 ・参照先は3種類、Parameters,Responses,Definitions ・Parameters,Responsesは自身を参照することは出来ない。Definitionsへの参照は可能。 ・DefinitionsはDefinitionsを参照することが出来る。ただし、Alias的(直接$refする)な参照は警告が出る。 ・responseのheaderの参照共用化は、出来ない。 ■Parameters Definitionsオブジェクト参照 #/paths/{path}/parameters/0/$ref #/paths/{path}/{method}/parameters/0/$ref → #/parameters/{name} (Parameterオブジェクトを定義) ■Responses Definitionsオブジェクト参照 #/paths/{path}/{method}/responses/{StatusCode}/$ref → #/responses/{name} (Responseオブジェクトを定義) ■Definitionsオブジェクト参照 #/paths/{path}/parameters/0/schema #/paths/{path}/{method}/parameters/0/schema #/paths/{path}/{method}/responses/{StatusCode}/schema #/parameters/{name}/schema #/responses/{name}/schema #/definitions/{name} /$ref /items/$ref /properties/{property}/$ref /properties/{property}/additionalProperties/$ref /properties/{property}/allOf/0/$ref → #/definitions/{name} Schemaオブジェクトを定義 ※{method}=get|put|post|delete|options|head|patch ■外部ファイル(YAML,JSON)参照 #/paths/{path}/$ref: '{path}.yaml' ※外部YAML,JSON参照
  15. Swaggerを書いていると、リクエストやレスポンス等に同一定義が繰り返し出てくる。 これらを共通化するのが、Referenceオブジェクト($ref)による参照である。 Swaggerの仕様では、Referenceオブジェクトを継承して新たなReferenceオブジェクトを 定義することが出来るなど、さまざまな機能があるが、少しわかりにくいので 整理する。 ・参照先は3種類、Parameters,Responses,Definitions ・Parameters,Responsesは自身を参照することは出来ない。Definitionsへの参照は可能。 ・DefinitionsはDefinitionsを参照することが出来る。ただし、Alias的(直接$refする)な参照は警告が出る。 ・responseのheaderの参照共用化は、出来ない。 ■Parameters Definitionsオブジェクト参照 #/paths/{path}/parameters/0/$ref #/paths/{path}/{method}/parameters/0/$ref → #/parameters/{name} (Parameterオブジェクトを定義) ■Responses Definitionsオブジェクト参照 #/paths/{path}/{method}/responses/{StatusCode}/$ref → #/responses/{name} (Responseオブジェクトを定義) ■Definitionsオブジェクト参照 #/paths/{path}/parameters/0/schema #/paths/{path}/{method}/parameters/0/schema #/paths/{path}/{method}/responses/{StatusCode}/schema #/parameters/{name}/schema #/responses/{name}/schema #/definitions/{name} /$ref /items/$ref /properties/{property}/$ref /properties/{property}/additionalProperties/$ref /properties/{property}/allOf/0/$ref → #/definitions/{name} Schemaオブジェクトを定義 ※{method}=get|put|post|delete|options|head|patch ■外部ファイル(YAML,JSON)参照 #/paths/{path}/$ref: '{path}.yaml' ※外部YAML,JSON参照
  16. Swaggerを書いていると、リクエストやレスポンス等に同一定義が繰り返し出てくる。 これらを共通化するのが、Referenceオブジェクト($ref)による参照である。 Swaggerの仕様では、Referenceオブジェクトを継承して新たなReferenceオブジェクトを 定義することが出来るなど、さまざまな機能があるが、少しわかりにくいので 整理する。 ・参照先は3種類、Parameters,Responses,Definitions ・Parameters,Responsesは自身を参照することは出来ない。Definitionsへの参照は可能。 ・DefinitionsはDefinitionsを参照することが出来る。ただし、Alias的(直接$refする)な参照は警告が出る。 ・responseのheaderの参照共用化は、出来ない。 ■Parameters Definitionsオブジェクト参照 #/paths/{path}/parameters/0/$ref #/paths/{path}/{method}/parameters/0/$ref → #/parameters/{name} (Parameterオブジェクトを定義) ■Responses Definitionsオブジェクト参照 #/paths/{path}/{method}/responses/{StatusCode}/$ref → #/responses/{name} (Responseオブジェクトを定義) ■Definitionsオブジェクト参照 #/paths/{path}/parameters/0/schema #/paths/{path}/{method}/parameters/0/schema #/paths/{path}/{method}/responses/{StatusCode}/schema #/parameters/{name}/schema #/responses/{name}/schema #/definitions/{name} /$ref /items/$ref /properties/{property}/$ref /properties/{property}/additionalProperties/$ref /properties/{property}/allOf/0/$ref → #/definitions/{name} Schemaオブジェクトを定義 ※{method}=get|put|post|delete|options|head|patch ■外部ファイル(YAML,JSON)参照 #/paths/{path}/$ref: '{path}.yaml' ※外部YAML,JSON参照
  17. Swaggerを書いていると、リクエストやレスポンス等に同一定義が繰り返し出てくる。 これらを共通化するのが、Referenceオブジェクト($ref)による参照である。 Swaggerの仕様では、Referenceオブジェクトを継承して新たなReferenceオブジェクトを 定義することが出来るなど、さまざまな機能があるが、少しわかりにくいので 整理する。 ・参照先は3種類、Parameters,Responses,Definitions ・Parameters,Responsesは自身を参照することは出来ない。Definitionsへの参照は可能。 ・DefinitionsはDefinitionsを参照することが出来る。ただし、Alias的(直接$refする)な参照は警告が出る。 ・responseのheaderの参照共用化は、出来ない。 ■Parameters Definitionsオブジェクト参照 #/paths/{path}/parameters/0/$ref #/paths/{path}/{method}/parameters/0/$ref → #/parameters/{name} (Parameterオブジェクトを定義) ■Responses Definitionsオブジェクト参照 #/paths/{path}/{method}/responses/{StatusCode}/$ref → #/responses/{name} (Responseオブジェクトを定義) ■Definitionsオブジェクト参照 #/paths/{path}/parameters/0/schema #/paths/{path}/{method}/parameters/0/schema #/paths/{path}/{method}/responses/{StatusCode}/schema #/parameters/{name}/schema #/responses/{name}/schema #/definitions/{name} /$ref /items/$ref /properties/{property}/$ref /properties/{property}/additionalProperties/$ref /properties/{property}/allOf/0/$ref → #/definitions/{name} Schemaオブジェクトを定義 ※{method}=get|put|post|delete|options|head|patch ■外部ファイル(YAML,JSON)参照 #/paths/{path}/$ref: '{path}.yaml' ※外部YAML,JSON参照