SlideShare uma empresa Scribd logo
1 de 83
RESTful WebAPI Design
2018/03/29
Akinari Tsugo
目次
• 基礎編
• RESTfulとは
• RESTとは
• ROAとは
• SOAとは
• 実践編
• リクエスト設計
• レスポンス設計
基礎編
“REST”を取り巻く知識として知っておくべきことは何か?
• RESTful とは
• REST とは
• ROA とは
• SOA とは
基礎編の学習目標
RESTfulとは
RESTful とは
RESTful
「RESTで求められる原則に従っている」こと
=
RESTful とは
RESTful WebAPI
RESTで求められる原則に従ったWebAPI
=
REST とは
REST とは
REpresentational State Transfer
REST とは
「分散型システムにおける設計原則群」
REST とは
REST = Representational State Transfer
2000年 Roy Fielding の博士論文で提唱された
「分散型システムにおける設計原則群」
(参考)
https://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm
└ CHAPTER 5 Representational State Transfer (REST)
REST制約
• nullスタート
• クライアント/サーバー
• ステートレス
• キャッシュ制御
• 統一インターフェース
• 階層化システム
• コードオンデマンド
REST制約
REST原則のみで成立
他の原則、設計思想とは独立
• nullスタート
• クライアント/サーバー
• ステートレス
• キャッシュ制御
• 統一インターフェース
• 階層化システム
• コードオンデマンド
REST制約
多層アーキテクチャ
Webサービス
• nullスタート
• クライアント/サーバー
• ステートレス
• キャッシュ制御
• 統一インターフェース
• 階層化システム
• コードオンデマンド
REST制約
ステートレスで
静的なものはキャッシュされる
Webサービス
• nullスタート
• クライアント/サーバー
• ステートレス
• キャッシュ制御
• 統一インターフェース
• 階層化システム
• コードオンデマンド
REST制約
共通の制約を守っている
Webサービス
• nullスタート
• クライアント/サーバー
• ステートレス
• キャッシュ制御
• 統一インターフェース
• 階層化システム
• コードオンデマンド
REST制約
共通の制約を守っている
Webサービス
• nullスタート
• クライアント/サーバー
• ステートレス
• キャッシュ制御
• 統一インターフェース
• 階層化システム
• コードオンデマンド
• リソースを特定するURI
• HTTPメソッドの利用
• メディアタイプ指定
• HATEOAS
REST制約
共通の制約を守っている
Webサービス
• nullスタート
• クライアント/サーバー
• ステートレス
• キャッシュ制御
• 統一インターフェース
• 階層化システム
• コードオンデマンド
• リソースを特定するURI
• HTTPメソッドの利用
• メディアタイプ指定
• HATEOAS
?
リソースとは
コンピュータ上に格納できる一連のデータ
たとえば…
• ソフトウェアのバージョン
• ブログのエントリ
• 猫に関する情報
• 猫の情報が保存されているディレクトリ
• 2人の知人同士の関係性
REST制約(統一インターフェース)
すべてのリソースは
一意にアクセス可能な
URIを持つ
• 統一インターフェース
• リソースを特定するURI
• HTTPメソッドの利用
• メディアタイプ指定
• HATEOAS
REST制約(統一インターフェース)
リソースに対する操作指定は
適切なHTTPメソッドを使う
• 統一インターフェース
• リソースを特定するURI
• HTTPメソッドの利用
• メディアタイプ指定
• HATEOAS
REST制約(統一インターフェース)
レスポンスは
既知のメディアタイプを指定
• 統一インターフェース
• リソースを特定するURI
• HTTPメソッドの利用
• メディアタイプ指定
• HATEOAS
REST制約(統一インターフェース)
レスポンスに
リソース間のリンクを含める
• 統一インターフェース
• リソースを特定するURI
• HTTPメソッドの利用
• メディアタイプ指定
• HATEOAS
Hypermedia As The Engine Of Application State
RESTを満たす設計
• 多層アーキテクチャ
• ステートレス
• URIを指定してリソース特定
• HTTPメソッドを利用したリソース操作
• 既知のメディアタイプでレスポンスを返す
• リソースをつなぐリンクをレスポンスに含める
ROAとは
ROA とは
Resource Oriented Architecture
ROA とは
RESTful インターフェースを備えた
リソースごとに設計を行う
システム構築概念
たとえば…
ブログサービス「example-blog.com」の「api」において
• ユーザー「tanaka」の「RESTを含む記事」を探す
• ユーザー「tanaka」が「新規記事」を投稿する
GET http://api.example-blog.com/tanaka/entries?q=REST
POST http://api.example-blog.com/tanaka/entries
SOAとは
SOA とは
Service Oriented Architecture
SOA とは
業務処理ごとに設計を行う
システム構築概念
たとえば…
ブログサービス「example-blog.com」の「api」において
• ユーザー「tanaka」の「RESTを含む記事」を探す
• ユーザー「tanaka」が「新規記事」を投稿する
GET http://api.example-blog.com/tanaka/search?q=REST
POST http://api.example-blog.com/tanaka/post
① RESTful とは?
② リソースとは?
③ RESTを満たすために考慮すべき設計上の制約は?
④ ROA と SOA の違いは?
基礎編の確認問題
実践編
RESTful WebAPI を設計するポイントはどんなところにあるか
• リクエスト設計
• レスポンス設計
実践編の学習目標
リクエスト設計
リクエスト設計
• URIの設計
• HTTPメソッドの適用
• クエリパラメータとパスの使い分け
良いURIとは
覚えやすくどんな機能を持つURIなのか
ひと目でわかる
URI設計で考慮すること
• 短く入力しやすい(冗長なパスを含まない)
• 人間が読んで理解できる(省略しない)
• 大文字小文字が混在していない(すべて小文字)
• 単語はハイフンでつなげる
• 単語は複数形を利用する
• エンコードを必要とする文字を使わない
• サーバー側のアーキテクチャが反映されていない
• 改造しやすい(Hackable)
• ルールが統一されている
URI設計で考慮すること
• 短く入力しやすい(冗長なパスを含まない)
⇒シンプルで覚えやすいものにすることで入力ミスを防ぐ
GET http://api.example.com/service/api/search
GET http://api.example.com/search
URI設計で考慮すること
• 人間が読んで理解できる(できるだけ省略しない)
⇒その省略はあなたの自己満足ではない?
国や文化が変わっても不変な表記にすることで
誤認識を防ぐ
GET http://api.example.com/sv/u
GET http://api.example.com/users
URI設計で考慮すること
• 大文字小文字が混在していない(すべて小文字)
⇒APIをわかりやすく、間違えにくくするためには統一が必要
統一するなら一般的に小文字
GET http://api.example.com/Users
GET http://api.example.com/users
URI設計で考慮すること
• 大文字小文字が混在していない(すべて小文字)
⇒APIをわかりやすく、間違えにくくするためには統一が必要
統一するなら一般的に小文字
GET http://api.example.com/Users
GET http://api.example.com/users
理由付けが少し弱いので
どちらかと言うと趣味趣向の世界?
URI設計で考慮すること
• 単語はハイフンでつなげる
⇒アンダースコアはタイプライターで下線を引くためのもの
ハイフンは単語をつなぐためのもの
GET http://api.example.com/popular_users
GET http://api.example.com/popular-users
URI設計で考慮すること
• 単語はハイフンでつなげる
⇒アンダースコアはタイプライターで下線を引くためのもの
ハイフンは単語をつなぐためのもの
GET http://api.example.com/popular_users
GET http://api.example.com/users/popular
単語の連結をするくらいなら
そもそもURIを見直す
URI設計で考慮すること
• 単語は複数形を利用する
⇒URIで表現しているのは「リソースの集合」
GET http://api.example.com/user/12345
GET http://api.example.com/users/12345
URI設計で考慮すること
• エンコードを必要とする文字を使わない
⇒URIから意味が理解できない
GET http://api.example.com/%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC
GET http://api.example.com/users
URI設計で考慮すること
• サーバー側のアーキテクチャを反映しない
⇒悪意あるユーザーに脆弱性を突かれる危険がある
GET http://api.example.com/cgi-bin/get_user.php?id=12345
GET http://api.example.com/users/12345
URI設計で考慮すること
• 改造しやすい(Hackable)
⇒システム依存の設計は意味が理解できない
GET http://api.example.com/items/alpha/12345
GET http://api.example.com/items/beta/23456
GET http://api.example.com/items/12345
URI設計で考慮すること
• ルールが統一されている
⇒一定のルールに従って設計することで間違いを防ぐ
GET http://api.example.com/friends?id=12345
POST http://api.example.com/friends/12345/message
友達情報取得
メッセージ投稿
GET http://api.example.com/friends/12345
POST http://api.example.com/friends/12345/messages
友達情報取得
メッセージ投稿
HTTPメソッドとURI
URI がリソースを示すのに対し
HTTPメソッドはリソースに対する操作を示す
GET /v1/users/123 HTTP/1.1
Host: api.example.com
操作 リソース
HTTP/1.1 メソッド
• OPTIONS
• GET
• HEAD
• POST
• PUT
• DELETE
• TRACE
• CONNECT
HTTP/1.1 メソッド(主要なもの)
メソッド名 説明
GET リソースの取得
POST リソースの新規登録
PUT 既存リソースの更新
DELETE リソースの削除
HEAD メタ情報の取得
たとえば…
• URIは同じでHTTPメソッドを変えることで操作を変える
GET http://api.example.com/users/12345
POST http://api.example.com/users
ユーザー情報取得
ユーザーの新規登録
PUT http://api.example.com/users/12345
ユーザーの更新
DELETE http://api.example.com/users/12345
ユーザーの削除
クエリパラメータとパスの使い分け
クエリパラメータとするかどうかの判断基準
• 一意なリソースを表すのに必要かどうか
• 省略可能かどうか
(例)検索条件(絞り込み条件)はパスに含めない
GET http://api.example.com/users?page=3
レスポンス設計
レスポンス設計
• データフォーマット
• データの内部構造
• エラー表現
データフォーマット
• 以下のいずれかをサポート
• XML
• JSON
• JSONP
※可能ならフォーマット指定できると良い
データの内部構造
• エンベロープは使わない
• 配列ではなくオブジェクトを返す
• オブジェクトはできるだけフラットにする
• ページネーションをサポートする情報を返す
• 日付はRFC3339 (W3C-DTF) 形式を使う
• 大きな数値(64bit整数)は文字列で返す
データの内部構造
• エンベロープは使わない
⇒そもそもHTTPヘッダーが同じ役割
{
"header": {
"status": "success",
"erorCode": 0,
},
"response": {
... 実際のデータ ...
}
}
データの内部構造
• オブジェクトはできるだけフラットにする
⇒レスポンスの容量を減らす
{
"id": "12345",
"name": "Tsuyoshi Tanaka",
"birthday":"3/23",
"gender": "male"
}
{
"id": "12345",
"name": "Tsuyoshi Tanaka",
"profile":{
"birthday":"3/23",
"gender": "male"
}
}
データの内部構造
• 配列ではなくオブジェクトを返す
⇒JSONインジェクション対策
{
"friends": [
{
"id": "12345",
"name": "Tsuyoshi Tanak"
},
{
"id": "12345",
"name": "Tsuyoshi Tanak"
},
...
]
}
[
{
"id": "12345",
"name": "Tsuyoshi Tanaka”
},
{
"id": "23456",
"name": “Kazuma Sato"
},
...
]
データの内部構造
• ページネーションをサポートする情報を返す
⇒ HATEOAS。REST制約を満たすため。
{
"results": [
{
"id": "12345",
"name": "Tsuyoshi Tanak"
},
...
],
"hasNext": true,
"nextPage": "/api.example.com/search?page=1"
}
データの内部構造
• 日付はRFC3339 (W3C-DTF) 形式を使う
⇒インターネット上で用いる標準形式
Thu, 29 Mar 2018 08:00:00 GMTRFC822 (RFC1123)
Thursday, 29-Mar-2018 08:00:00 GMTRFC850
1521781500Unixタイムスタンプ
2018-03-29T17:00:00+09:00RFC3339 (W3C-DTF)
データの内部構造
• 大きな数値(64bit整数)は文字列で返す
⇒システムによって扱えない or 誤差が出るケースがある
{
"id": 123456789012345678
"id_str": "123456789012345678",
}
エラー表現
• ステータスコードで表現する
• エラー詳細はレスポンスボディに入れる
• エラーの際にHTMLが返らないようにする
• サービス閉塞時は503を返し、Retry-Afterをつける
エラー表現
• ステータスコードで表現する
⇒既にあるものはキチンと使いましょう。
ステータスコード 意味
100番台 情報
200番台 成功
300番台 リダイレクト
400番台 クライアントサイドに起因するエラー
500番台 サーバーサイドに起因するエラー
エラー表現
• エラー詳細はレスポンスボディに入れる
⇒足りない情報は追加しましょう。
HTTP/1.1 400 Bad Request
Server: api.example.com
Date: Sun, 25 Mar 2018 01:57:25 GMT
Content-Type: application/json; charset=utf-8
{
"code": "1234567890"
"message": "不正な検索条件です。"
}
エラー表現
• エラーの際にHTMLが返らないようにする
⇒レスポンスフォーマットが変わると
クライアントアプリ側で処理できないケースがある
HTTP/1.1 404 Not Found
Date: Sat, 24 Mar 2018 02:16:54 GMT
Server: api.example.com
Content-Type: text/html
Content-Length: 17707
<!DOCTYPE html>
<html lang="ja">
<head>
...
エラー表現
• サービス閉塞時は503を返し、Retry-Afterをつける
⇒SEO的にこの方法が良い。
クライアント側もいつから再開してよいかわかる。
HTTP/1.1 503 Service Temporary Unavailable
Server: api.example.com
Date: Sun, 25 Mar 2018 01:57:25 GMT
Content-Type: application/json; charset=utf-8
Retry-After: Mon, 2 Apr 2018 01:00:00 GMT
{
"code": "2345678901"
"message" : "現在サービスを利用できません。"
}
次のリクエストのうち適切な設計のものはどれか?
①
②
③
④
実践編の確認問題
GET http://api.example.com/user/12345
GET http://api.example.com/service/api/search
GET http://api.example.com/cgi-bin/get_user.php?id=12345
POST http://api.example.com/users/delete?id=12345
ユーザー情報の削除
ユーザー情報の取得
ユーザー情報の取得
ユーザーの検索
次のレスポンスのうち不適切な設計箇所はどこか?
実践編の確認問題
HTTP/1.1 200 Success
Date: Sat, 24 Mar 2018 02:16:54 GMT
... 一部省略 ...
{
"header": {
"status": "success",
"erorCode": 1234567890,
},
"response": {
"id": 123456789012345678,
"name": "Tsuyoshi Tanaka",
"profile":{
"birthday":"Fri, 29 Mar 1991 09:00:00 GMT",
"gender": "male"
}
}
}
まとめ
基礎編
• RESTfulとは
「RESTで求められる原則に従っている」こと
• RESTとは
「分散型システムにおける設計原則群」
• ROA とは
RESTful インターフェースを備えた
リソースごとに設計を行うシステム構築概念
• SOA とは
業務処理ごとに設計を行うシステム構築概念
実践編
• リクエスト設計
• URIの設計
• HTTPメソッドの適用
• クエリパラメータとパスの使い分け
実践編
• リクエスト設計
• URIの設計
• 短く入力しやすい(冗長なパスを含まない)
• 人間が読んで理解できる(省略しない)
• 大文字小文字が混在していない(すべて小文字)
• 単語はハイフンでつなげる
• 単語は複数形を利用する
• エンコードを必要とする文字を使わない
• サーバー側のアーキテクチャが反映されていない
• 改造しやすい(Hackable)
• ルールが統一されている
• HTTPメソッドの適用
• クエリパラメータとパスの使い分け
実践編
• リクエスト設計
• URIの設計
• HTTPメソッドの適用
• GET リソースの取得
• POST リソースの新規登録
• PUT 既存リソースの更新
• DELETE リソースの削除
• HEAD メタ情報の取得
• クエリパラメータとパスの使い分け
実践編
• リクエスト設計
• URIの設計
• HTTPメソッドの適用
• クエリパラメータとパスの使い分け
• 一意なリソースを表すのに必要かどうか
• 省略可能かどうか
実践編
• レスポンス設計
• データフォーマット
• データの内部構造
• エラー表現
実践編
• レスポンス設計
• データフォーマット
• XML
• JSON
• JSONP
• データの内部構造
• エラー表現
実践編
• レスポンス設計
• データフォーマット
• データの内部構造
• エンベロープは使わない
• 配列ではなくオブジェクトを返す
• オブジェクトはできるだけフラットにする
• ページネーションをサポートする情報を返す
• 日付はRFC3339 (W3C-DTF) 形式を使う
• 大きな数値(64bit整数)は文字列で返す
• エラー表現
実践編
• レスポンス設計
• データフォーマット
• データの内部構造
• エラー表現
• ステータスコードで表現する
• エラー詳細はレスポンスボディに入れる
• エラーの際にHTMLが返らないようにする
• サービス閉塞時は503を返し、Retry-Afterをつける
RESTful Web API Design

Mais conteúdo relacionado

Semelhante a RESTful Web API Design

RESTful #とは RailsスタイルからRESTを学ぼう
RESTful #とは RailsスタイルからRESTを学ぼうRESTful #とは RailsスタイルからRESTを学ぼう
RESTful #とは RailsスタイルからRESTを学ぼうToru Kawamura
 
AWS Black Belt Online Seminar 2017 Amazon Athena
AWS Black Belt Online Seminar 2017 Amazon AthenaAWS Black Belt Online Seminar 2017 Amazon Athena
AWS Black Belt Online Seminar 2017 Amazon AthenaAmazon Web Services Japan
 
汎用Web API“SPARQL”でオープンデータ検索
汎用Web API“SPARQL”でオープンデータ検索汎用Web API“SPARQL”でオープンデータ検索
汎用Web API“SPARQL”でオープンデータ検索uedayou
 
SPARQLアプリケーション開発
SPARQLアプリケーション開発SPARQLアプリケーション開発
SPARQLアプリケーション開発Toshiaki Katayama
 
WebDAV, ATOM, and REST
WebDAV, ATOM, and RESTWebDAV, ATOM, and REST
WebDAV, ATOM, and RESTTaisuke Yamada
 
アナリティクスをPostgreSQLで始めるべき10の理由@第6回 関西DB勉強会
アナリティクスをPostgreSQLで始めるべき10の理由@第6回 関西DB勉強会アナリティクスをPostgreSQLで始めるべき10の理由@第6回 関西DB勉強会
アナリティクスをPostgreSQLで始めるべき10の理由@第6回 関西DB勉強会Satoshi Nagayasu
 
20170714_MySQLドキュメントストア JSONデータ型&JSON関数 by 日本オラクル株式会社 MySQL GBU 山﨑由章
20170714_MySQLドキュメントストア JSONデータ型&JSON関数 by 日本オラクル株式会社 MySQL GBU 山﨑由章20170714_MySQLドキュメントストア JSONデータ型&JSON関数 by 日本オラクル株式会社 MySQL GBU 山﨑由章
20170714_MySQLドキュメントストア JSONデータ型&JSON関数 by 日本オラクル株式会社 MySQL GBU 山﨑由章Insight Technology, Inc.
 
SPARQLを利用した逆マッシュアップ-プログラミングを必要としないアプリ作成方法-
SPARQLを利用した逆マッシュアップ-プログラミングを必要としないアプリ作成方法-SPARQLを利用した逆マッシュアップ-プログラミングを必要としないアプリ作成方法-
SPARQLを利用した逆マッシュアップ-プログラミングを必要としないアプリ作成方法-uedayou
 
Elasticsearchの基本動作まとめ
Elasticsearchの基本動作まとめElasticsearchの基本動作まとめ
Elasticsearchの基本動作まとめ朋哉 池田
 
Azure Cosmos DB を使った高速分散アプリケーションの設計パターン
Azure Cosmos DB を使った高速分散アプリケーションの設計パターンAzure Cosmos DB を使った高速分散アプリケーションの設計パターン
Azure Cosmos DB を使った高速分散アプリケーションの設計パターンKazuyuki Miyake
 
実践 Reactive Extensions
実践 Reactive Extensions実践 Reactive Extensions
実践 Reactive ExtensionsShin Ise
 
IOTS2021発表スライド:オントロジーを用いたOpenAPI Documentの制約推薦システム
IOTS2021発表スライド:オントロジーを用いたOpenAPI Documentの制約推薦システムIOTS2021発表スライド:オントロジーを用いたOpenAPI Documentの制約推薦システム
IOTS2021発表スライド:オントロジーを用いたOpenAPI Documentの制約推薦システムAkira Shibata
 
RubyとPost Gis
RubyとPost GisRubyとPost Gis
RubyとPost Gisngi group.
 
MySQLのNoSQL機能 - MySQL JSON & HTTP Plugin for MySQL
MySQLのNoSQL機能 - MySQL JSON & HTTP Plugin for MySQLMySQLのNoSQL機能 - MySQL JSON & HTTP Plugin for MySQL
MySQLのNoSQL機能 - MySQL JSON & HTTP Plugin for MySQLRyusuke Kajiyama
 
RESTful Web アプリの設計レビューの話
RESTful Web アプリの設計レビューの話RESTful Web アプリの設計レビューの話
RESTful Web アプリの設計レビューの話Takuto Wada
 

Semelhante a RESTful Web API Design (20)

RESTful #とは RailsスタイルからRESTを学ぼう
RESTful #とは RailsスタイルからRESTを学ぼうRESTful #とは RailsスタイルからRESTを学ぼう
RESTful #とは RailsスタイルからRESTを学ぼう
 
AWS Black Belt Online Seminar 2017 Amazon Athena
AWS Black Belt Online Seminar 2017 Amazon AthenaAWS Black Belt Online Seminar 2017 Amazon Athena
AWS Black Belt Online Seminar 2017 Amazon Athena
 
Apache Solr 入門
Apache Solr 入門Apache Solr 入門
Apache Solr 入門
 
汎用Web API“SPARQL”でオープンデータ検索
汎用Web API“SPARQL”でオープンデータ検索汎用Web API“SPARQL”でオープンデータ検索
汎用Web API“SPARQL”でオープンデータ検索
 
SPARQLアプリケーション開発
SPARQLアプリケーション開発SPARQLアプリケーション開発
SPARQLアプリケーション開発
 
WebDAV, ATOM, and REST
WebDAV, ATOM, and RESTWebDAV, ATOM, and REST
WebDAV, ATOM, and REST
 
アナリティクスをPostgreSQLで始めるべき10の理由@第6回 関西DB勉強会
アナリティクスをPostgreSQLで始めるべき10の理由@第6回 関西DB勉強会アナリティクスをPostgreSQLで始めるべき10の理由@第6回 関西DB勉強会
アナリティクスをPostgreSQLで始めるべき10の理由@第6回 関西DB勉強会
 
20170714_MySQLドキュメントストア JSONデータ型&JSON関数 by 日本オラクル株式会社 MySQL GBU 山﨑由章
20170714_MySQLドキュメントストア JSONデータ型&JSON関数 by 日本オラクル株式会社 MySQL GBU 山﨑由章20170714_MySQLドキュメントストア JSONデータ型&JSON関数 by 日本オラクル株式会社 MySQL GBU 山﨑由章
20170714_MySQLドキュメントストア JSONデータ型&JSON関数 by 日本オラクル株式会社 MySQL GBU 山﨑由章
 
SPARQLを利用した逆マッシュアップ-プログラミングを必要としないアプリ作成方法-
SPARQLを利用した逆マッシュアップ-プログラミングを必要としないアプリ作成方法-SPARQLを利用した逆マッシュアップ-プログラミングを必要としないアプリ作成方法-
SPARQLを利用した逆マッシュアップ-プログラミングを必要としないアプリ作成方法-
 
Elasticsearchの基本動作まとめ
Elasticsearchの基本動作まとめElasticsearchの基本動作まとめ
Elasticsearchの基本動作まとめ
 
Rest ful api設計入門
Rest ful api設計入門Rest ful api設計入門
Rest ful api設計入門
 
Azure Cosmos DB を使った高速分散アプリケーションの設計パターン
Azure Cosmos DB を使った高速分散アプリケーションの設計パターンAzure Cosmos DB を使った高速分散アプリケーションの設計パターン
Azure Cosmos DB を使った高速分散アプリケーションの設計パターン
 
実践 Reactive Extensions
実践 Reactive Extensions実践 Reactive Extensions
実践 Reactive Extensions
 
[Japan Tech summit 2017] DAL 005
[Japan Tech summit 2017] DAL 005[Japan Tech summit 2017] DAL 005
[Japan Tech summit 2017] DAL 005
 
IOTS2021発表スライド:オントロジーを用いたOpenAPI Documentの制約推薦システム
IOTS2021発表スライド:オントロジーを用いたOpenAPI Documentの制約推薦システムIOTS2021発表スライド:オントロジーを用いたOpenAPI Documentの制約推薦システム
IOTS2021発表スライド:オントロジーを用いたOpenAPI Documentの制約推薦システム
 
全文検索入門
全文検索入門全文検索入門
全文検索入門
 
RubyとPost Gis
RubyとPost GisRubyとPost Gis
RubyとPost Gis
 
MySQLのNoSQL機能 - MySQL JSON & HTTP Plugin for MySQL
MySQLのNoSQL機能 - MySQL JSON & HTTP Plugin for MySQLMySQLのNoSQL機能 - MySQL JSON & HTTP Plugin for MySQL
MySQLのNoSQL機能 - MySQL JSON & HTTP Plugin for MySQL
 
RESTful Web アプリの設計レビューの話
RESTful Web アプリの設計レビューの話RESTful Web アプリの設計レビューの話
RESTful Web アプリの設計レビューの話
 
Yesod(at FPM2012)
Yesod(at FPM2012)Yesod(at FPM2012)
Yesod(at FPM2012)
 

Mais de Akinari Tsugo

Develop Web Application with Node.js + Express
Develop Web Application with Node.js + ExpressDevelop Web Application with Node.js + Express
Develop Web Application with Node.js + ExpressAkinari Tsugo
 
Software Test Monitoring
Software Test MonitoringSoftware Test Monitoring
Software Test MonitoringAkinari Tsugo
 
Software Test Technique
Software Test TechniqueSoftware Test Technique
Software Test TechniqueAkinari Tsugo
 
第8回 業開中心会議 LT 「User Agent の 変遷」
第8回業開中心会議 LT 「User Agent の 変遷」第8回業開中心会議 LT 「User Agent の 変遷」
第8回 業開中心会議 LT 「User Agent の 変遷」Akinari Tsugo
 

Mais de Akinari Tsugo (7)

Develop Web Application with Node.js + Express
Develop Web Application with Node.js + ExpressDevelop Web Application with Node.js + Express
Develop Web Application with Node.js + Express
 
Software Test Monitoring
Software Test MonitoringSoftware Test Monitoring
Software Test Monitoring
 
Software Test Technique
Software Test TechniqueSoftware Test Technique
Software Test Technique
 
Software Test Basic
Software Test BasicSoftware Test Basic
Software Test Basic
 
Node.js Hands-On
Node.js Hands-OnNode.js Hands-On
Node.js Hands-On
 
Startup JavaScript
Startup JavaScriptStartup JavaScript
Startup JavaScript
 
第8回 業開中心会議 LT 「User Agent の 変遷」
第8回業開中心会議 LT 「User Agent の 変遷」第8回業開中心会議 LT 「User Agent の 変遷」
第8回 業開中心会議 LT 「User Agent の 変遷」
 

RESTful Web API Design