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
npmパッケージをMCPによって導入しやすくする
t_pori418
1
62
AIと開発する話をみんなとシェアしたい
t_pori418
1
140
AIとプロダクトエンジニア
t_pori418
0
120
AIの言う通りにやったら Webアプリが作れるのか試してみた (ChatGPT)
t_pori418
0
1.1k
AWSにおけるアカウント/ユーザーとは何かをなんとなく理解する
t_pori418
0
380
Markdownで登壇資料を作りたい
t_pori418
0
490
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
Other Decks in Technology
See All in Technology
Claude Skillsの テスト業務での活用事例
moritamasami
1
110
アラフォーおじさん、はじめてre:Inventに行く / A 40-Something Guy’s First re:Invent Adventure
kaminashi
0
170
Claude Codeを使った情報整理術
knishioka
12
9.2k
意外と知らない状態遷移テストの世界
nihonbuson
PRO
1
280
Amazon Quick Suite で始める手軽な AI エージェント
shimy
2
1.9k
ハッカソンから社内プロダクトへ AIエージェント「ko☆shi」開発で学んだ4つの重要要素
sonoda_mj
6
1.7k
Snowflake導入から1年、LayerXのデータ活用の現在 / One Year into Snowflake: How LayerX Uses Data Today
civitaspo
0
2.5k
Oracle Database@Azure:サービス概要のご紹介
oracle4engineer
PRO
3
200
2025年の医用画像AI/AI×medical_imaging_in_2025_generated_by_AI
tdys13
0
130
2025年のデザインシステムとAI 活用を振り返る
leveragestech
0
350
モダンデータスタックの理想と現実の間で~1.3億人Vポイントデータ基盤の現在地とこれから~
taromatsui_cccmkhd
2
270
AI駆動開発の実践とその未来
eltociear
2
500
Featured
See All Featured
Testing 201, or: Great Expectations
jmmastey
46
7.8k
Ten Tips & Tricks for a 🌱 transition
stuffmc
0
37
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
9.1k
Building the Perfect Custom Keyboard
takai
1
660
A designer walks into a library…
pauljervisheath
210
24k
Product Roadmaps are Hard
iamctodd
PRO
55
12k
Reflections from 52 weeks, 52 projects
jeffersonlam
355
21k
How GitHub (no longer) Works
holman
316
140k
Build your cross-platform service in a week with App Engine
jlugia
234
18k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
132
19k
Utilizing Notion as your number one productivity tool
mfonobong
2
190
30 Presentation Tips
portentint
PRO
1
180
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} で更新をかけていくのが、あるべ き姿なのでは?みたいな意見ありそう こういう事例あるよ、とかあったらぜひ教えてください
以上です! 良い更新処理実装ライフを!