Saya mengembangkan layanan RESTful sederhana untuk turnamen dan jadwal. Ketika sebuah turnamen dibuat melalui permintaan POST yang berisi badan JSON, turnamen tersebut dimasukkan ke dalam BiMap
, dinyatakan sebagai berikut dalam implementasi DAO:
private BiMap<String, Tournament> tournaments = Maps.synchronizedBiMap(HashBiMap.create());
Ketika sebuah turnamen dibuat, id string yang terkait dikembalikan sehingga pengguna dapat memiliki referensi di masa depan dari turnamen itu. Ia dapat memperoleh informasi kembali dari turnamen baru dengan melakukan permintaan berikut:
GET http://localhost:8080/eventscheduler/c15268ce-474a-49bd-a623-b0b865386f39
Tetapi bagaimana jika tidak ada turnamen dengan id seperti itu ditemukan? Sejauh ini, saya mengembalikan respons 204. Nah, Jersey melakukannya untuk saya ketika kembali null
dari salah satu metodenya. Ini adalah metode yang sesuai dengan rute di atas:
@Path("/{id}")
@GET
@Produces(MediaType.APPLICATION_JSON)
public Tournament getTournament(@PathParam("id") String id) {
Optional<Tournament> optTournament = tournamentDao.getTournament(id);
if (optTournament.isPresent())
return optTournament.get();
return null;
}
Pertanyaan saya adalah: apakah 204: No Content
boleh mengembalikan jawaban, atau haruskah itu 404
balasan, karena sumber daya tidak ditemukan?
Jika saya harus mengubahnya ke 404, pertanyaan yang jelas: Saya harus mengubah metode tanda tangan kan? Karena sekarang turnamen (tipe Tournament
) mungkin tidak dikembalikan, metodenya akan terlihat berbeda. Saya harus menggunakan Response
tipe sebagai jenis kembali bukan?
sumber
{content: ''}
), respons 204 akan tidak pantas.2015-02-29
akan lebih baik, karena itu kencan yang tidak ada sama sekali?Anda harus mengembalikan 404. Anda dapat melakukannya dengan melempar NotFoundException ( https://jersey.java.net/apidocs/2.6/jersey/javax/ws/rs/NotFoundException.html ).
Lihat juga pertanyaan SO ini jika Anda perlu mengontrol tipe konten yang dikembalikan /programming/23858488/how-i-return-http-404-json-xml-response-in-jax-rs- jersey-on-tomcat
sumber
Permintaan Anda adalah
GET http://localhost:8080/eventscheduler/c15268ce-474a-49bd-a623-b0b865386f39
.Jika
http://localhost:8080/eventscheduler/
tidak ada sebagai titik akhir, Anda harus mengembalikan 404. Anda mencoba mengakses sumber daya (/eventscheduler/
) yang tidak ada. Ini akan menunjukkan kepada klien bahwa server adalocalhost:8080
, tetapi tidak ada dieventscheduler
titik akhir.Jika
http://localhost:8080/eventscheduler/
ada sebagai titik akhir tetapi sumber daya yang diperlukan tidak tersedia, kesalahan 5xx tepat. Contoh yang baik dari ini adalah jika database sedang offline, di mana Anda bisa mengembalikan 503. Tentu saja, Anda mungkin hanya ingin mengembalikan kesalahan 500 generik daripada contoh khusus.Jika
http://localhost:8080/eventscheduler/
ada tetapi hal yang diwakili olehc15268ce-474a-49bd-a623-b0b865386f39
tidak ada, saya akan mengembalikan 200 dengan badan yang menunjukkan rincian. Titik akhir ada, permintaan yang dibuat benar-benar valid dan dapat diproses, tetapi tidak ada kecocokan.Jika permintaan klien Anda ke titik akhir tidak valid, Anda akan melihat kesalahan 4xx lainnya. Anda dapat menunjukkan bahwa klien tidak berwenang untuk mengakses titik akhir atau item yang diminta dengan 401 atau 403 atau dapat menggunakan 400 untuk menunjukkan bahwa permintaan tersebut tidak valid. Dengan semua ini, informasi tambahan dapat diberikan di badan respons.
sumber
/user
dan digunakan seperti/[email protected]
. Sebagai konsumen API, saya ingin tahu apakah/user
karena alasan tertentu tidak ada di server (mungkin ditambahkan di v2 API dan server ada di v1 atau diubah namanya di v3) atau jika pengguna dengan email[email protected]
tidak ada. Yang pertama adalah 404, yang kedua adalah 200 dengan tubuh yang menunjukkan tidak ada pengguna dengan alamat email itu.