kita perlu mengirim semua data artikel kembali ke API untuk memperbarui dan pekerjaan multi-pengguna tidak dapat dilaksanakan. Misalnya, editor dapat mengirim data 5 detik yang lebih lama dan menimpa perbaikan yang dilakukan beberapa jurnalis lain 2 detik yang lalu dan tidak ada cara yang bisa saya jelaskan kepada klien ini karena mereka yang mempublikasikan sebuah artikel sama sekali tidak terhubung dengan memperbarui konten.
Hal semacam ini merupakan tantangan, apa pun yang Anda lakukan, ini adalah masalah yang sangat mirip dengan kontrol sumber terdistribusi (mercurial, git, dll.), Dan solusinya, yang dieja dalam HTTP / ReST, terlihat sedikit mirip.
Andaikata Anda memiliki dua pengguna, Alice dan Bob, keduanya sedang mengerjakan /articles/lunch
. (untuk kejelasan, responsnya berani)
Pertama, alice membuat artikel.
PUT /articles/lunch HTTP/1.1
Host: example.com
Content-Type: text/plain
Authorization: Basic YWxpY2U6c2VjcmV0
Hey Bob, what do you want for lunch today?
301 Moved Permanently
Location: /articles/lunch/1
Server tidak membuat sumber daya, karena tidak ada "versi" yang terlampir pada permintaan, (dengan asumsi pengidentifikasi /articles/{id}/{version}
. Untuk melakukan pembuatan, Alice dialihkan ke url artikel / versi yang akan dibuatnya. Pengguna Alice agen kemudian akan mengajukan kembali permintaan di alamat baru.
PUT /articles/lunch/1 HTTP/1.1
Host: example.com
Content-Type: text/plain
Authorization: Basic YWxpY2U6c2VjcmV0
Hey Bob, what do you want for lunch today?
201 Created
Dan sekarang artikelnya sudah dibuat. selanjutnya, bob melihat artikel:
GET /articles/lunch HTTP/1.1
Host: example.com
Authorization: Basic Ym9iOnBhc3N3b3Jk
301 Moved Permanently
Location: /articles/lunch/1
Bob melihat ke sana:
GET /articles/lunch/1 HTTP/1.1
Host: example.com
Authorization: Basic Ym9iOnBhc3N3b3Jk
200 Ok
Content-Type: text/plain
Hey Bob, what do you want for lunch today?
Dia memutuskan untuk menambahkan kembaliannya sendiri.
PUT /articles/lunch/1 HTTP/1.1
Host: example.com
Content-Type: text/plain
Authorization: Basic Ym9iOnBhc3N3b3Jk
Hey Bob, what do you want for lunch today?
Does pizza sound good to you, Alice?
301 Moved Permanently
Location: /articles/lunch/2
Seperti halnya Alice, Bob dialihkan ke tempat ia akan membuat versi baru.
PUT /articles/lunch/2 HTTP/1.1
Host: example.com
Content-Type: text/plain
Authorization: Basic Ym9iOnBhc3N3b3Jk
Hey Bob, what do you want for lunch today?
Does pizza sound good to you, Alice?
201 Created
Akhirnya, Alice memutuskan untuk menambah artikelnya sendiri:
PUT /articles/lunch/1 HTTP/1.1
Host: example.com
Content-Type: text/plain
Authorization: Basic YWxpY2U6c2VjcmV0
Hey Bob, what do you want for lunch today?
I was thinking about getting Sushi.
409 Conflict
Location: /articles/lunch/3
Content-Type: text/diff
---/articles/lunch/2
+++/articles/lunch/3
@@ 1,2 1,2 @@
Hey Bob, what do you want for lunch today?
-Does pizza sound good to you, Alice?
+I was thinking about getting Sushi.
Alih-alih diarahkan kembali seperti biasa, kode status yang berbeda dikembalikan ke klien 409
,, yang memberi tahu Alice bahwa versi yang ia coba cabut telah bercabang. Sumber daya baru dibuat anyways (seperti yang ditunjukkan oleh Location
header), dan perbedaan antara keduanya termasuk dalam badan respons. Alice sekarang tahu bahwa permintaan yang baru saja dibuatnya perlu digabungkan.
Semua pengalihan ini terkait dengan semantik PUT
, yang mengharuskan sumber daya baru dibuat persis di tempat yang diminta oleh garis permintaan. ini juga bisa menghemat siklus permintaan menggunakan POST
, tetapi kemudian nomor versi harus dikodekan dalam permintaan oleh sihir lain, yang tampaknya kurang jelas bagi saya untuk tujuan ilustrasi, tetapi mungkin masih akan lebih disukai dalam API nyata untuk meminimalkan siklus permintaan / respons.
api/article?action=publish
? Parameter kueri dimaksudkan untuk kasus-kasus seperti itu di mana keadaan sumber daya bergantung pada 'algoritma' (atau tindakan) yang Anda sebutkan. Misalnyaapi/articles?sort=asc
valid