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
WebAPIのPATCHについて
Search
thori
June 03, 2023
Technology
0
220
WebAPIのPATCHについて
WebAPIのPATCHの挙動について改めて調べたことをgunmawebというコミュニティでLTしました。
thori
June 03, 2023
Tweet
Share
More Decks by thori
See All by thori
AIと開発する話をみんなとシェアしたい
t_pori418
1
130
AIとプロダクトエンジニア
t_pori418
0
110
AIの言う通りにやったら Webアプリが作れるのか試してみた (ChatGPT)
t_pori418
0
1.1k
AWSにおけるアカウント/ユーザーとは何かをなんとなく理解する
t_pori418
0
380
Markdownで登壇資料を作りたい
t_pori418
0
480
GitHub Projectsのみでプロダクト開発を管理する
t_pori418
0
350
Nuxt.jsから始めるPWA生活
t_pori418
0
1.2k
10分でAmazon API GatewayにOpen API 3.0のAPI仕様をインポートする
t_pori418
1
1.2k
AWSサーバーレスアーキテクチャでWebサイトを構築してみた
t_pori418
0
860
Other Decks in Technology
See All in Technology
龍昌餃子で理解するWebサーバーの並行処理モデル - 東葛.dev #9
kozy4324
1
140
決済システムの信頼性を支える技術と運用の実践
ykagano
0
430
手を動かしながら学ぶデータモデリング - 論理設計から物理設計まで / Data modeling
soudai
PRO
0
660
コード1ミリもわからないけど Claude CodeでFigjamプラグインを作った話
abokadotyann
1
160
日々のSlackアラート確認運用をCustom Chat Modesで楽にした話 / 日々のSlackアラート確認運用をCustom Chat Modesで楽にした話
imamotohikaru
0
380
Copilotの精度を上げる!カスタムプロンプト入門.pdf
ismk
10
3.2k
嗚呼、当時の本番環境の状態で AI Agentを再評価したいなぁ...
po3rin
0
390
隙間ツール開発のすすめ / PHP Conference Fukuoka 2025
meihei3
0
290
[Oracle TechNight#94] Oracle AI World 2025 Oracle Database関連フィードバック
oracle4engineer
PRO
0
310
Proxmox × HCP Terraformで始めるお家プライベートクラウド
lamaglama39
1
170
AIエージェントは「使う」だけじゃなくて「作る」時代! 〜最新フレームワークで楽しく開発入門しよう〜
minorun365
10
1.6k
Dart and Flutter MCP serverで実現する AI駆動E2Eテスト整備と自動操作
yukisakai1225
0
260
Featured
See All Featured
Building a Modern Day E-commerce SEO Strategy
aleyda
45
8k
Building an army of robots
kneath
306
46k
What's in a price? How to price your products and services
michaelherold
246
12k
Documentation Writing (for coders)
carmenintech
76
5.1k
Statistics for Hackers
jakevdp
799
220k
Embracing the Ebb and Flow
colly
88
4.9k
Being A Developer After 40
akosma
91
590k
Learning to Love Humans: Emotional Interface Design
aarron
274
41k
Reflections from 52 weeks, 52 projects
jeffersonlam
355
21k
A Tale of Four Properties
chriscoyier
161
23k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.5k
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.5k
Transcript
WebAPIのPATCHについて Takashi Hori
自己紹介 Twitter: @t_pori418 From: 神奈川(now) <- 館林生まれ Work: (近況) 都内のWeb系でチームのTechleadをしています。
副業で0->1のWebエンジニアもやってます。 Language: Ruby, PHP, C#, Python, TypeScript
問: REST API、作ってますか?
ふわっとした知識で話すとよく発生する議論 • 更新処理ってPUTでいいんだっけ?PATCH?どっち? • 更新処理を実装する時、「フィールドがない」「null」「空」の扱いってどうなるんだっ け?
PUTとPATCHについて 一般的には... • PUT ◦ 渡されて来たパラメータでデータを置き換える( nullやundefinedも) ◦ つまりモデルをdelete ->
insertする • PATCH ◦ 渡されてきたパラメータのみデータを置き換える ◦ つまり部分更新が可能
でも結構適当にやってるパターン、よく見ませんか? • 更新処理は一律PUT!そもそもRESTfulな設計は業務アプリでは無理だし! • 返却するステータスコードは全部200で! とか 正直、HTTPのメソッドやステータスコードはなんでも動くんですが、 API実装する側も利用する側も挙動が決まってないと困りませんか? 困りそうだったので一般的にはどうなのか調べました 基本はさっきのスライドの通り、PUTはdelete
-> insertなのでPATCHについて。
定番のChatGPT(無料版)に聞くやつ
RFC7396 For example, given the following original JSON document: Changing
the value of "a" and removing "f" can be achieved by sending: { "a": "b", "c": { "d": "e", "f": "g" } } RFC7396 - JSON Merge Patch 日本語訳 https://tex2e.github.io/rfc-translater/html/rfc7396.html PATCH /target HTTP/1.1 Host: example.org Content-Type: application/merge-patch+json { "a":"z", "c": { "f": null } } ターゲットリソースに適用されると、「 a」メンバーの値は「z」に 置き換えられ、「f」は削除され、残りのコンテンツはそのままに なります。
考えたこと • nullはDB設計次第だが、許容しないようにバリデーションで弾くケースが多そう。だ けど基本的にRFCに則った実装にしておくのが無難そう • RESTfulなAPIではなく、子のモデルも一緒に更新処理かけたい時どうするか問題 ◦ 例えばorders.order_detailsみたいなのがあった時、 order変更APIで、order_deitalsの配列を ごそっと一緒に替えたい。置き換えるのか?とか。そこだけ
PUTみたいな挙動になっちゃう { "amount": 1100, "tax": 100, "order_details": [ {id: 1, product_id: 1, amount: 400, tax: 40, tax_rate: 10}, {id: 2, product_id: 2, amount: 600, tax: 60, tax_rate: 10} ] }
配列による更新について、個人的には... • 配列内のオブジェクトそれぞれidをリクエストパラメータに含められるなら ◦ あったら更新、なかったら削除、新しいものは作成という挙動がよさそう • 配列内のオブジェクトそれぞれidをリクエストパラメータに持てない場合 ◦ 紐づくデータを削除→渡されたものをinsertという挙動がよさそう そもそも中身のリソースは
PATCH /order_details/{id} で更新をかけていくのが、あるべ き姿なのでは?みたいな意見ありそう こういう事例あるよ、とかあったらぜひ教えてください
以上です! 良い更新処理実装ライフを!