Apakah Java memiliki enum lengkap untuk kode respons HTTP?

267

Saya bertanya-tanya apakah ada tipe enum di beberapa perpustakaan kelas Java standar yang mendefinisikan konstanta simbolik untuk semua kode respons HTTP yang valid. Ini harus mendukung konversi ke / dari nilai integer yang sesuai.

Saya men-debug beberapa kode Java yang menggunakan javax.ws.rs.core.Response.Status. Ini berfungsi, tetapi hanya mendefinisikan sekitar setengah dari kode respons HTTP yang valid.

Zoltan Szilagyi
sumber

Jawaban:

280

Saya tidak berpikir ada satu yang lengkap di kelas Java standar; HttpURLConnectionhilang beberapa kode, seperti HTTP 100/Continue.

Ada daftar lengkap di Apache HttpComponents, meskipun:
org.apache.http.HttpStatus(diganti org.apache.commons.HttpClient.HttpStatusdari Apache Http Client, yang mencapai akhir masa pakainya )

John Feminella
sumber
5
Tidak ada yang namanya "daftar lengkap", karena kode status dapat dan diperpanjang.
Julian Reschke
16
@JulianReschke Saya pikir "lengkap" di sini harus dianggap berarti "sesuai dengan semua kode yang dijelaskan oleh standar".
John Feminella
2
John: "standar" tidak mendefinisikan "semua" kode status. Itu sebabnya ada registry.
Julian Reschke
1
iana.org/assignments/http-status-codes/http-status-codes.xml memiliki daftar besar termasuk kode = 100
Garis M Suero
1
@ Donal: sekali lagi, bukan daftar yang bagus. Yang relevan adalah registri IANA.
Julian Reschke
66

Antarmuka javax.servlet.http.HttpServletResponsedari servlet API memiliki semua kode respons dalam bentuk intnama konstanta SC_<description>. Lihat http://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpServletResponse.html

David Rabinowitz
sumber
3
HttpServletResponse mendukung RFC1945 dan bagian dari standar RFC2616, tetapi tidak memiliki semua RFC2518. Jika Anda memerlukan daftar lengkap, lihat HttpStatus seperti yang saya sebutkan.
John Feminella
2
HttpServletResponse juga kehilangan kode respons 418 yang didefinisikan dalam RFC 2324
daiscog
Menggunakan HttpServletResponse dalam apa pun yang berjalan di luar servlet cenderung menyebabkan masalah ketergantungan berlian karena kelas yang tumpang tindih dalam artefak servlet yang berbeda.
Elliotte Rusty Harold
51

Nah, ada konstanta statis dari nilai integer yang tepat di kelas HttpURLConnection

Mistik
sumber
6
Terima kasih! ini berfungsi tanpa ketergantungan eksternal. java.net.HttpURLConnection.HTTP_BAD_REQUEST
comonad
Bagus bahwa itu adalah bagian dari perpustakaan standar tetapi sayangnya itu tidak lengkap - dalam kisaran 400 misalnya memotong pada 415.
tschumann
18

Jika Anda menggunakan Spring, rilis 3.x memiliki apa yang Anda cari: http://static.springsource.org/spring/docs/3.0.x/api/org/springframework/http/HttpStatus.html

Ed J
sumber
3
Saya ingin menambahkan bahwa Springs org.springframework.http.HttpStatus ( docs.spring.io/spring/docs/current/javadoc-api/org/... ) enum, adalah satu-satunya yang saya bisa menemukan yang berisi dokumentasi Java dengan link ke daftar lengkap kode status dan penggunaannya di setiap enum. Jika Anda sudah menggunakan Spring maka ini akan menjadi perpustakaan untuk digunakan.
lastmannorth
2
Ini memiliki 100 dan 418. Sayang sekali bahwa Anda harus menelepon HttpStatus.XXX.value()untuk mendapatkan int.
WesternGun
7

Jika Anda menggunakan Netty , Anda dapat menggunakan:

Andrejs
sumber
sayangnya ini bukan enum dan karenanya tidak dapat digunakan dalam pernyataan kasus (yang membuat saya sedih)
Frederick Roth
7

Semua orang tampaknya mengabaikan bagian "enum type" dari pertanyaan Anda.

Meskipun tidak ada sumber kanonik untuk Kode Status HTTP, ada cara sederhana untuk menambahkan konstanta Status yang Anda perlukan ke konstanta yang disediakan dengan javax.ws.rs.core.Response.Statustanpa menambahkan dependensi tambahan pada proyek Anda.

javax.ws.rs.core.Response.Statushanyalah salah satu implementasi dari javax.ws.rs.core.Response.StatusTypeantarmuka. Anda hanya perlu membuat enum implementasi Anda sendiri dengan definisi untuk Kode Status yang Anda inginkan.

Pustaka inti seperti Javax, Jersey, dll. Ditulis ke antarmuka StatusType bukan implementasi Status (atau mereka tentu harus ). Karena Status enum yang baru Anda implementasikan, StatusTypeia dapat digunakan di mana pun Anda akan menggunakan javax.ws.rs.core.Response.Statuskonstanta.

Ingatlah bahwa kode Anda sendiri juga harus ditulis ke StatusTypeantarmuka. Ini akan memungkinkan Anda untuk menggunakan kedua Kode Status Anda sendiri di samping yang "standar".

Berikut adalah intisari dengan implementasi sederhana dengan konstanta yang ditentukan untuk Kode Status "Informational 1xx": https://gist.github.com/avendasora/a5ed9acf6b1ee709a14a

David Avendasora
sumber
5

Gunakan kelas javax.servlet.http.HttpServletResponse

Contoh:

javax.servlet.http.HttpServletResponse.SC_UNAUTHORIZED //401
javax.servlet.http.HttpServletResponse.SC_INTERNAL_SERVER_ERROR //500
Andrés Canavesi
sumber
4
untuk pengembangan klien, sangat berat untuk memasukkan seluruh API servlet hanya untuk mengambil kode-kode ini.
Jeffrey Blattman
1
Mungkin berat untuk beberapa kasus tetapi saya telah menemukan jawaban yang bagus ini dan saya sedang menulis aplikasi web berbasis servlet sehingga bagus untuk saya.
Andrei Rînea
2
Jawaban rangkap, diposting lebih dari tiga tahun kemudian? Harus dihapus.
zb226
4

1) Untuk mendapatkan teks alasan jika Anda hanya memiliki kode, Anda dapat menggunakan:

org.apache.http.impl.EnglishReasonPhraseCatalog.INSTANCE.getReason(httpCode,null)

Di mana httpCodeakan menjadi kode alasan yang Anda dapatkan dari respons HTTP.

Lihat https://hc.apache.org/httpcomponents-core-ga/httpcore/apidocs/org/apache/http/impl/EnglishReasonPhraseCatalog.html untuk detail

2) Untuk mendapatkan kode alasan jika Anda hanya memiliki teks, Anda dapat menggunakan BasicHttpResponse.

Lihat di sini untuk detail: https://hc.apache.org/httpcomponents-core-ga/httpcore/apidocs/org/apache/http/message/BasicHttpResponse.html

Teluk Maira
sumber
0

Penyedia terbaik untuk konstanta kode status http cenderung kelas org.eclipse.jetty.http.HttpStatus Jetty karena:

  • ada paket javadoc di maven yang penting jika Anda mencari konstanta dan hanya tahu nomornya -> cukup buka halaman api docs dan cari nomornya
  • konstanta berisi nomor kode status itu sendiri.

Satu-satunya hal yang akan saya perbaiki: letakkan nomor kode status di depan deskripsi teks untuk membuat pencarian penyelesaian otomatis lebih nyaman ketika Anda mulai dengan kode.

pengguna1050755
sumber
-1

Pilihan lain adalah menggunakan HttpStatuskelas dari Apache commons-httpclient yang memberikan Anda berbagai status Http sebagai konstanta.

ak123
sumber