Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
フレームワーク バックエンド / 2023 ニフティ新人研修
Search
ニフティ株式会社
PRO
December 14, 2023
Programming
0
370
フレームワーク バックエンド / 2023 ニフティ新人研修
2023年度ニフティエンジニア新人研修の講義資料です。
ニフティ株式会社
PRO
December 14, 2023
Tweet
Share
More Decks by ニフティ株式会社
See All by ニフティ株式会社
Dify触ってみた。
niftycorp
PRO
0
90
Amazon Bedrockを使用して、 運用対応を楽にしてみた
niftycorp
PRO
0
78
自社製CMSからの脱却:10件のWebサイト再構築に学ぶ運用重視の技術選定 - NIFTY Tech Day 2025
niftycorp
PRO
0
33
エンジニアの殻を破る:インナーソースと社外活動がもたらした成長 - NIFTY Tech Day 2025
niftycorp
PRO
0
20
システム全体像把握の超高速化〜システム関連図を使い倒そう (LT) - NIFTY Tech Day 2025
niftycorp
PRO
0
21
Rust で生成 AI の社内 chatbot をメンテしている話 (LT) - NIFTY Tech Day 2025
niftycorp
PRO
0
24
メタバースは仕事に使える?〜100日間でバーチャルオフィスへの挑戦〜 (LT) - NIFTY Tech Day 2025
niftycorp
PRO
0
16
AWSでもOracleしたい!DB移行指南:マネージドサービス活用して属人化も解消 - NIFTY Tech Day 2025
niftycorp
PRO
0
19
スクラムマスター入門者のための学習マップ 効果的な学びと実践 - NIFTY Tech Day 2025
niftycorp
PRO
0
25
Other Decks in Programming
See All in Programming
Boos Performance and Developer Productivity with Jakarta EE 11
ivargrimstad
0
590
pylint custom ruleで始めるレビュー自動化
shogoujiie
0
160
お前もAI鬼にならないか?👹Bolt & Cursor & Supabase & Vercelで人間をやめるぞ、ジョジョー!👺
taishiyade
7
4.2k
GoとPHPのインターフェイスの違い
shimabox
2
210
CloudNativePGを布教したい
nnaka2992
0
120
iOSでQRコード生成奮闘記
ktcryomm
2
120
Ça bouge du côté des animations CSS !
goetter
2
160
15分で学ぶDuckDBの可愛い使い方 DuckDBの最近の更新
notrogue
3
820
データベースのオペレーターであるCloudNativePGがStatefulSetを使わない理由に迫る
nnaka2992
0
250
TCAを用いたAmebaのリアーキテクチャ
dazy
0
220
LINE messaging APIを使ってGoogleカレンダーと連携した予約ツールを作ってみた
takumakoike
0
130
CSS Linter による Baseline サポートの仕組み
ryo_manba
1
160
Featured
See All Featured
Fireside Chat
paigeccino
35
3.2k
A better future with KSS
kneath
238
17k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
160
15k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
175
52k
KATA
mclloyd
29
14k
A Tale of Four Properties
chriscoyier
158
23k
[RailsConf 2023] Rails as a piece of cake
palkan
53
5.3k
Thoughts on Productivity
jonyablonski
69
4.5k
GraphQLの誤解/rethinking-graphql
sonatard
69
10k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
7
660
Designing on Purpose - Digital PM Summit 2013
jponch
117
7.1k
A Modern Web Designer's Workflow
chriscoyier
693
190k
Transcript
2023年度エンジニア定例 フレームワーク回バックエンド
バックエンドパートでは 主にAPIについてお話しま す
話す内容 ・APIとは? ・APIの種類 ・REST APIとREST原則 ・リクエストとレスポンス ・HTTPメソッド ・ヘッダー ・URI ・ペイロード
・HTTPステータスコード
APIってなに?
沢山の言葉が出てきます アプリケーションプログラミングインタフェース(API、英: Application Programming Interface)[注釈 1]とは、広義では ソフトウェアコンポーネント同士が互いに情報をやりとりするのに使用するインタフェースの仕様である。 APIには、サブルーチン、データ構造、オブジェクトクラス、変数などの仕様が含まれる。APIには様々な形態があり、POSIX のような国際標準規格、マイクロソフトのWindows APIのようなベンダーによる文書、プログラミング言語の標準ライブラ
リ(例えば、C++のStandard Template LibraryやJava API(英語版)など)がある。 商業的に使われる狭義では、各種システムやサービス(ハードウェア、OS、ミドルウェアおよびWebサービス等)を利用す るアプリケーションソフトウェア (Application) を開発・プログラミング (Programming) するためのインタフェース (Interface) である[1][2][3][4][5]。こちらの意味では、システムやサービスから直接提供されないもの、例えば言語の標準ラ イブラリは含まない。 APIはアプリケーションバイナリインタフェース (ABI) とは異なる。APIはソースコードベースだが、ABIはバイナリインタフ ェースである。例えば、POSIXはAPIだが、Linux Standard Base (LSB) はABIである[6](LSBはいろいろな規定の集合なの で、正確には「LSBには、ABIにまで踏み込んでいる部分もある」)。 引用: https://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83% A7%E3%83%B3%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%82% A4%E3%83%B3%E3%82%BF%E3%83%95%E3%82%A7%E3%83%BC%E3%82%B9
むずかしい
沢山の言葉が出てきます APIってわかりやすく 言うと何?
ソフトウェアの一部機能を公開/共有 出来る仕組みのこと 引用:https://www.itmanage.co.jp/column/application-programming-interface/
APIを使うと何がうれし い?
最新情報の取得が容易になる ⇒情報の確認や更新の手間が省ける 開発の効率化に繋がる ⇒機能の開発時間を大幅に短縮できる
APIにはどんな種類があ る?
主に2種類 WebAPI(今回説明するのはこちら) ⇒Webサービス機能の一部として提供されているAPI OSが提供するAPI ⇒OS上でプログラミングを行うために用意されたAPI 引⽤︓https://cloudapi.kddi-web.com/magazine/api-types-and-protocols
今回はWebAPIについて 説明
多くのWebAPIはREST原則に基づいている REST原則に基づいたものをREST APIと呼ぶ
REST原則って何?
原則1︓ステートレスなクライアント/サーバプロトコル HTTPメッセージの全てがリクエストを理解するための必要な情報を含んでいることから、HTTP通信を⾏うクライアントもサ ーバもメッセージ間におけるセッションの状態を記憶している必要がありません。 ※ ステートレスと表現していますが、実 際には Cookie などを使⽤しセッション状態を管理しています。 原則2︓リソースを⼀意なURIにより識別される RESTfulなシステムでは全てのリソース(情報)はURI(Uniform
Resource Identifier)で表現される ユニークなアドレスを持ちます。 原則3︓HTTPメソッドで操作⽅法を表現した統⼀されたインターフェース リソースを操作するメソッドは、HTTPで定義され ている "GET"、"POST"、"PUT"、"DELETE" などを使⽤します。つまり、情報を操作する命令体系があらかじめ定義されて います。 原則4︓アプリケーション情報と状態遷移の両⽅を扱える ハイパーメディアの使⽤リソースを様々な形式(HTML、XML、 JSON、バイナリ)で表現できるようにします。また、関連する データはハイパーメディア(リンク)としてデータに含め ることができます。 引⽤元︓https://www.infraexpert.com/study/sdn09.html
ちょっとむずかしい
簡単にすると... 原則1︓サーバーとクライアントがデータ交換をする時に、お互いのセッション状態は記憶してなくてもいいよ 原則2︓所望のデータを取りたい際に、APIを叩くときのおまじないは⼀意に定まるよ 原則3︓APIを叩く際には "GET"、"POST"、"PUT"、"DELETE" を使ってユーザが何をしたいのかをわかりやすくするよ 原則4︓アプリケーション情報と状態遷移の両⽅を扱える ハイパーメディアの使⽤リソースを様々な形式(HTML、XML、 JSON、バイナリ)で表現できるようにします。また、関連する データはハイパーメディア(リンク)としてデータに含め
ることができます
APIの実例を⾒てみる 実例として、zipcloudの郵便番号API検索を利⽤︓https://zipcloud.ibsnet.co.jp/doc/api
郵便番号検索のAPI $ curl “https://zipcloud.ibsnet.co.jp/api/search?zipcode=7830060” { "message": null, "results": [ {
"address1": "⾼知県", "address2": "南国市", "address3": "蛍が丘", "kana1": "コウチケン", "kana2": "ナンコクシ", "kana3": "ホタルガオカ", "prefcode": "39", "zipcode": "7830060" } ], "status": 200 }
何が起きているの︖
APIの概念について例⽰
ファストフードの注⽂に例えると
②商品 ①注⽂ お客 店員 ⾏動︓購⼊ 注⽂︓ハンバーガーセット ⾷べる場所︓店内
所定の注⽂をすると、 きちんと商品が貰える
APIも同じ
所定の注⽂(リクエスト)をすると、 きちんと商品(レスポンス)が貰える
レスポンス リクエスト エンドポイント 通信元 URI プロトコル︓https ドメイン︓zipcloud.ibsnet.co.jp リソースパス︓api/search パラメータ︓zipcode=7830060 メソッド︓GET
HTTPステータスコード︓200 ヘッダー︓受付⽇時、コンテンツタイプなど ヘッダー︓通信元の情報など ペイロード︓住所や読み⽅など (ペイロード︓詳細な情報)
知らない⾔葉が沢⼭ある
ひとつひとつ⾒ていく
レスポンス リクエスト エンドポイント 通信元 URI プロトコル︓https ドメイン︓zipcloud.ibsnet.co.jp リソースパス︓api/search パラメータ︓zipcode=7830060 メソッド︓GET
HTTPレスポンス︓200 ヘッダー︓受付⽇時、コンテンツタイプなど ヘッダー︓通信元の情報など ペイロード︓住所や読み⽅など (ペイロード︓詳細な情報) URI プロトコル︓https ドメイン︓zipcloud.ibsnet.co.jp リソースパス︓api/search パラメータ︓zipcode=7830060 HTTPレスポンス︓200 ヘッダー︓受付⽇時、コンテンツタイプなど ヘッダー︓通信元の情報など ペイロード︓住所や読み⽅など (ペイロード︓詳細な情報) URI プロトコル︓https ドメイン︓zipcloud.ibsnet.co.jp リソースパス︓api/search パラメータ︓zipcode=7830060 HTTPステータスコード︓200 ヘッダー︓受付⽇時、コンテンツタイプなど ヘッダー︓通信元の情報など ペイロード︓住所や読み⽅など (ペイロード︓詳細な情報)
メソッド(HTTPメソッド) とは︖
リクエストを⾏う際に 「どのような操作を⾏いたいか」 を決定するために使⽤します
主に4つのメソッドが使われている HTTPメソッド 機能 GET リクエスト先の情報(リソース)を取得する際 に使⽤する POST 新しいリソース情報を送り込む PUT リソース情報を新しい情報で置き換える
DELETE リソース情報を削除する
レスポンス リクエスト エンドポイント 通信元 URI プロトコル︓https ドメイン︓zipcloud.ibsnet.co.jp リソースパス︓api/search パラメータ︓zipcode=7830060 メソッド︓GET
ヘッダー︓受付⽇時、コンテンツタイプなど ヘッダー︓通信元の情報など ペイロード︓住所や読み⽅など (ペイロード︓詳細な情報) URI プロトコル︓https ドメイン︓zipcloud.ibsnet.co.jp リソースパス︓api/search パラメータ︓zipcode=7830060 ヘッダー︓受付⽇時、コンテンツタイプなど ヘッダー︓通信元の情報など ペイロード︓住所や読み⽅など (ペイロード︓詳細な情報) URI プロトコル︓https ドメイン︓zipcloud.ibsnet.co.jp リソースパス︓api/search パラメータ︓zipcode=7830060 ヘッダー︓受付⽇時、コンテンツタイプなど ヘッダー︓通信元の情報など ペイロード︓住所や読み⽅など (ペイロード︓詳細な情報) HTTPステータスコード︓200
レスポンス リクエスト エンドポイント 通信元 URI プロトコル︓https ドメイン︓zipcloud.ibsnet.co.jp リソースパス︓api/search パラメータ︓zipcode=7830060 メソッド︓GET
ヘッダー︓受付⽇時、コンテンツタイプなど ヘッダー︓通信元の情報など ペイロード︓住所や読み⽅など (ペイロード︓詳細な情報) URI プロトコル︓https ドメイン︓zipcloud.ibsnet.co.jp リソースパス︓api/search パラメータ︓zipcode=7830060 ヘッダー︓受付⽇時、コンテンツタイプなど ヘッダー︓通信元の情報など ペイロード︓住所や読み⽅など (ペイロード︓詳細な情報) URI プロトコル︓https ドメイン︓zipcloud.ibsnet.co.jp リソースパス︓api/search パラメータ︓zipcode=7830060 ヘッダー︓受付⽇時、コンテンツタイプなど ヘッダー︓通信元の情報など ペイロード︓住所や読み⽅など (ペイロード︓詳細な情報) HTTPステータスコード︓200
ヘッダーとは︖
クライアントやサーバーが HTTPリクエストやレスポンスで 追加情報を渡すことができる
代表的なヘッダー情報 ・サーバーとやりとりするための認証情報 ・やりとりした⽇時 ・クッキー ・などなど...
郵便番号検索のAPIのレスポンスヘッダ $ curl --head "https://zipcloud.ibsnet.co.jp/api/search?zipcode=7830060" HTTP/2 200 access-control-allow-origin: * content-type:
text/plain;charset=utf-8 x-cloud-trace-context: c948f2b622f8591dae93a05b17ce65c2 content-length: 290 date: Fri, 14 Jul 2023 04:41:35 GMT server: Google Frontend
URIとは︖
名前または場所を識別する書き⽅のルールの総称 (URN U URL) = URI
レスポンス リクエスト エンドポイント 通信元 URI プロトコル︓https ドメイン︓zipcloud.ibsnet.co.jp リソースパス︓api/search パラメータ︓zipcode=7830060 メソッド︓GET
ヘッダー︓受付⽇時、コンテンツタイプなど ヘッダー︓通信元の情報など ペイロード︓住所や読み⽅など (ペイロード︓詳細な情報) URI プロトコル︓https ドメイン︓zipcloud.ibsnet.co.jp リソースパス︓api/search パラメータ︓zipcode=7830060 ヘッダー︓受付⽇時、コンテンツタイプなど ヘッダー︓通信元の情報など ペイロード︓住所や読み⽅など (ペイロード︓詳細な情報) URI プロトコル︓https ドメイン︓zipcloud.ibsnet.co.jp リソースパス︓api/search パラメータ︓zipcode=7830060 ヘッダー︓受付⽇時、コンテンツタイプなど ヘッダー︓通信元の情報など ペイロード︓住所や読み⽅など (ペイロード︓詳細な情報) HTTPステータスコード︓200
ペイロードとは︖
パケット通信においてパケットに含まれるヘッダやト レーラなどの付加的情報を除いた、データ本体のこと
<リクエスト> POSTやPUTなどのHTTPメソッドを使う場合、 ここに各種情報を⼊れて叩く <レスポンス> 欲しいデータがこの中に⼊っているよ
レスポンス リクエスト エンドポイント 通信元 URI プロトコル︓https ドメイン︓zipcloud.ibsnet.co.jp リソースパス︓api/search パラメータ︓zipcode=7830060 メソッド︓GET
HTTPレスポンス︓200 ヘッダー︓受付⽇時、コンテンツタイプなど ヘッダー︓通信元の情報など ペイロード︓住所や読み⽅など (ペイロード︓詳細な情報) URI プロトコル︓https ドメイン︓zipcloud.ibsnet.co.jp リソースパス︓api/search パラメータ︓zipcode=7830060 HTTPレスポンス︓200 ヘッダー︓受付⽇時、コンテンツタイプなど ヘッダー︓通信元の情報など ペイロード︓住所や読み⽅など (ペイロード︓詳細な情報) URI プロトコル︓https ドメイン︓zipcloud.ibsnet.co.jp リソースパス︓api/search パラメータ︓zipcode=7830060 HTTPステータスコード︓ 200 ヘッダー︓受付⽇時、コンテンツタイプなど ヘッダー︓通信元の情報など ペイロード︓住所や読み⽅など (ペイロード︓詳細な情報)
HTTPステータスコードとは︖
レスポンスに表⽰される3桁の番号のこと クライアントのWebブラウザとサーバ間ではHTTPリクエストに対し てレスポンスを返す
ステータスコード 状態 説明 有名なステータスコード 100番台 正常 クライアントからのリクエスト を受け⼊れ可能で、継続して処 理されている状態 100
Continue リクエスト継続可能 200番台 正常 クライアントからリクエストが サーバに送られ理解されて受理 された状態です。 200 OK リクエストが正常に処理できた 300番台 正常 リクエストを完了させるために 追加的な処理が必要です。 300 Multiple Choice リクエストに対して 複数のレスポンスがあることを示す 400番台 エラー クライアント(ユーザ)側で操 作や⼊⼒に不備があった際に出 てしまうエラー 404 Not Found Webページが見つからない 500番台 エラー サーバ側で問題が⽣じていてい る際に出てしまうエラー 500 Internal Server Error 何らかのサーバ 内で起きたエラー
レスポンス リクエスト エンドポイント 通信元 URI プロトコル︓https ドメイン︓zipcloud.ibsnet.co.jp リソースパス︓api/search パラメータ︓zipcode=7830060 メソッド︓GET
HTTPレスポンス︓200 ヘッダー︓受付⽇時、コンテンツタイプなど ヘッダー︓通信元の情報など ペイロード︓住所や読み⽅など (ペイロード︓詳細な情報) URI プロトコル︓https ドメイン︓zipcloud.ibsnet.co.jp リソースパス︓api/search パラメータ︓zipcode=7830060 HTTPレスポンス︓200 ヘッダー︓受付⽇時、コンテンツタイプなど ヘッダー︓通信元の情報など ペイロード︓住所や読み⽅など (ペイロード︓詳細な情報) URI プロトコル︓https ドメイン︓zipcloud.ibsnet.co.jp リソースパス︓api/search パラメータ︓zipcode=7830060 HTTPステータスコード︓ 200 ヘッダー︓受付⽇時、コンテンツタイプなど ヘッダー︓通信元の情報など ペイロード︓住所や読み⽅など (ペイロード︓詳細な情報)
パラメータとは
APIが処理に使うための情報 主に3種類 パスパラメータ ⇒URLドメイン以下のパス 例)https://support.nifty.com/mypage/ クエリパラメータ ⇒URLの”?”以降 例)https://zipcloud.ibsnet.co.jp/api/search?zipcode=7830060 ペイロード ⇒HTTPリクエストの際に送るデータ本体
パラメータとは
もう⼀度APIの実例を⾒てみる
郵便番号検索のAPI $ curl https://zipcloud.ibsnet.co.jp/api/search?zipcode=7830060 { "message": null, "results": [ {
"address1": "⾼知県", "address2": "南国市", "address3": "蛍が丘", "kana1": "コウチケン", "kana2": "ナンコクシ", "kana3": "ホタルガオカ", "prefcode": "39", "zipcode": "7830060" } ], "status": 200 }
郵便番号検索のAPI $ curl https://zipcloud.ibsnet.co.jp/api/search?zipcode=7830060 { "message": null, "results": [ {
"address1": "⾼知県", "address2": "南国市", "address3": "蛍が丘", "kana1": "コウチケン", "kana2": "ナンコクシ", "kana3": "ホタルガオカ", "prefcode": "39", "zipcode": "7830060" } ], "status": 200 } URI ペイロード HTTPステータスコード レスポンス クエリパラメータ パスパラメータ