Saya menggunakan RESTlet dan saya telah membuat sumber daya. Saya menangani POST dengan acceptRepresentation
metode overriding .
Klien harus mengirimi saya beberapa data, lalu saya menyimpannya ke DB, menyetel respons ke 201 (SUCCESS_CREATED) dan saya perlu mengembalikan beberapa data ke klien, tetapi mengembalikan jenis acceptRepresentation
adalah void
.
Dalam kasus saya, saya perlu mengembalikan beberapa pengenal agar klien dapat mengakses sumber daya itu.
Misalnya, jika saya memiliki sumber daya dengan URL /resource
dan klien mengirimkan permintaan POST, saya menambahkan baris baru di DB dan alamatnya seharusnya /resource/{id}
. Saya perlu mengirim {id}
.
Apakah saya melakukan sesuatu yang salah? Apakah prinsip REST memungkinkan untuk mengembalikan sesuatu setelah POST? Jika ya, bagaimana saya bisa melakukannya, dan jika tidak bagaimana cara menangani situasi ini?
Jawaban:
REST hanya mengatakan bahwa Anda harus menyesuaikan dengan antarmuka seragam. Dengan kata lain, dikatakan bahwa Anda harus melakukan apa yang seharusnya dilakukan POST sesuai spesifikasi HTTP . Berikut kutipan dari spesifikasi yang relevan,
Seperti yang dapat Anda lihat dari sini, Anda memiliki dua tempat di mana Anda dapat menunjukkan kepada klien di mana sumber daya yang baru dibuat berada. Header Lokasi harus memiliki URL yang mengarah ke sumber daya baru dan Anda juga dapat mengembalikan entitas dengan detailnya.
Saya tidak yakin apa perbedaan antara overriding acceptRepresentation () dan overriding post () tetapi contoh ini menunjukkan bagaimana mengembalikan respons dari POST.
sumber
Request and Response messages MAY transfer an entity if not otherwise restricted by the request method or response status code. An entity consists of entity-header fields and an entity-body, although some responses will only include the entity-headers.
Saya akan melupakan mengirimkan apa pun ke dalam tubuh tanggapan. Cukup setel Lokasi: ke URL (lengkap) dari sumber daya yang baru dibuat.
Deskripsi Anda menunjukkan bahwa inilah semantik Anda:
Ada lagi yang tidak berguna.
sumber
Dua pertanyaan berbeda:
Apakah pola aplikasi REST mendukung pengembalian data dalam POST?
Saya tidak berpikir REST secara eksplisit melarangnya, tetapi perawatan yang disukai dijabarkan dalam jawaban Darrel.
Apakah kerangka kerja RESTlet memungkinkan pengembalian data dalam POST?
Ya, meskipun mengembalikan void, dalam kelas yang memperluas Resource, Anda memiliki akses penuh ke objek objek Respon melalui metode getResponse (). Jadi Anda bisa memanggil getResponse (). SetEntity () dengan data apa pun yang Anda inginkan.
sumber
Keluarkan dalam format apa pun yang diminta. Itu mungkin:
<success> <id>5483</id> </success>
Atau:
{ "type": "success", "id": 5483 }
Itu tergantung pada apa yang biasanya Anda lakukan. Jika mereka tidak mengharapkan datanya, mereka harus mengabaikannya, tetapi klien mana pun yang ingin menanganinya dengan benar harus bisa.
sumber
Jika Anda merespons 201 Dibuat dengan badan entitas, bukan pengalihan Lokasi, sebaiknya sertakan tajuk Lokasi-Konten yang menunjuk ke sumber daya yang diwakili dalam respons.
Hal ini akan menghindari potensi kebingungan - di mana klien dapat (secara wajar) mengasumsikan bahwa entitas respons sebenarnya mewakili keadaan baru 'pencipta', dan bukan sumber daya yang dibuat.
> POST /collection > ..new item.. < 201 Created < Location: /collection/1354 < Content-Location: /collection/1354 < <div class="item">This is the new item that was created</div>
sumber