Java มี enum ที่สมบูรณ์สำหรับรหัสตอบกลับ HTTP หรือไม่


267

ฉันสงสัยว่ามีประเภท enum ในไลบรารีคลาส Java มาตรฐานที่กำหนดค่าคงที่เชิงสัญลักษณ์สำหรับรหัสตอบกลับ HTTP ที่ถูกต้องทั้งหมดหรือไม่ ควรสนับสนุนการแปลงเป็น / จากค่าจำนวนเต็มที่สอดคล้องกัน

ฉันกำลังดีบักโค้ด Java บางตัวที่ใช้ javax.ws.rs.core.Response.Status ใช้งานได้ แต่กำหนดเพียงครึ่งเดียวของรหัสตอบกลับ HTTP ที่ถูกต้อง

คำตอบ:


280

ฉันไม่คิดว่าจะมีหนึ่งที่สมบูรณ์ในคลาส Java มาตรฐาน; จะหายไปค่อนข้างรหัสไม่กี่เช่น HttpURLConnectionHTTP 100/Continue

มีรายการที่สมบูรณ์ใน Apache HttpComponents แต่:
org.apache.http.HttpStatus(แทนที่org.apache.commons.HttpClient.HttpStatusจาก Apache Http Client ซึ่งหมดอายุการใช้งาน )


5
ไม่มีสิ่งเช่น "รายการที่สมบูรณ์" เป็นรหัสสถานะสามารถและจะได้รับการขยาย
Julian Reschke

16
@JulianReschke ฉันคิดว่า "สมบูรณ์" ที่นี่ควรจะหมายถึง "สอดคล้องกับรหัสทั้งหมดที่ระบุไว้โดยมาตรฐาน"
John Feminella

2
จอห์น: "มาตรฐาน" ไม่ได้กำหนดรหัสสถานะ "ทั้งหมด" นั่นเป็นเหตุผลที่มีรีจิสทรี
Julian Reschke

1
iana.org/assignments/http-status-codes/http-status-codes.xmlมีรายการขนาดใหญ่รวมถึงรหัส = 100
Garis M Suero

1
@ Donal: อีกครั้งไม่ใช่รายการที่ดี สิ่งที่เกี่ยวข้องคือรีจิสตรีของ IANA
Julian Reschke

66

อินเตอร์เฟซjavax.servlet.http.HttpServletResponseจากเซิร์ฟเล็ต API มีทั้งหมดรหัสการตอบสนองในรูปแบบของชื่อค่าคงที่int SC_<description>ดูhttp://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpServletResponse.html


3
HttpServletResponse รองรับ RFC1945 และเป็นส่วนหนึ่งของมาตรฐาน RFC2616 แต่ไม่มี RFC2518 ทั้งหมด หากคุณต้องการรายชื่อทั้งหมดดู HttpStatus ตามที่ฉันพูดถึง
John Feminella

2
HttpServletResponse ยังขาดรหัสตอบกลับ 418 ที่กำหนดในRFC 2324
daiscog

การใช้ HttpServletResponse ในทุกสิ่งที่ทำงานนอก servlet มีแนวโน้มที่จะนำไปสู่ปัญหาการพึ่งพาเพชรเนื่องจากคลาสที่ทับซ้อนกันในคลาส servlet ที่ต่างกัน
Elliotte Rusty Harold

51

มีค่าคงที่แบบคงที่ของค่าจำนวนเต็มที่แน่นอนในคลาสHttpURLConnection


6
ขอบคุณ! สิ่งนี้ทำงานได้โดยไม่ต้องพึ่งพาภายนอกใด ๆ java.net.HttpURLConnection.HTTP_BAD_REQUEST
comonad

ดีว่ามันเป็นส่วนหนึ่งของห้องสมุดมาตรฐาน แต่โชคร้ายที่มันไม่สมบูรณ์ - อยู่ในช่วง 400 ตัวอย่างเช่นการตัดที่ 415
tschumann

18

หากคุณกำลังใช้ Spring รุ่น 3.x จะมีสิ่งที่คุณต้องการ: http://static.springsource.org/spring/docs/3.0.x/api/org/springframework/http/HttpStatus.html


3
ฉันต้องการเพิ่มที่สปริงorg.springframework.http.HttpStatus ( docs.spring.io/spring/docs/current/javadoc-api/org/ … ) enum เป็นสิ่งเดียวที่ฉันสามารถหาที่ให้เอกสาร Java กับลิงค์ ไปยังรายการรหัสสถานะและการใช้งานทั้งหมดในแต่ละ enum หากคุณใช้ Spring อยู่แล้วนี่จะเป็นห้องสมุดที่จะใช้
lastmannorth

2
มันมี 100 และ 418 น่าเสียดายที่คุณต้องโทรหาHttpStatus.XXX.value()เพื่อรับ int
WesternGun


7

ดูเหมือนว่าทุกคนจะไม่สนใจส่วน "ประเภท enum" ของคำถามของคุณ

แม้ว่าจะไม่มีแหล่งที่มาแบบบัญญัติสำหรับรหัสสถานะ HTTP แต่ก็มีวิธีง่ายๆในการเพิ่มค่าคงที่สถานะที่ขาดหายไปที่คุณต้องการให้กับแหล่งที่มาโดยjavax.ws.rs.core.Response.Statusไม่ต้องเพิ่มการอ้างอิงเพิ่มเติมใด ๆ ในโครงการของคุณ

javax.ws.rs.core.Response.Statusเป็นเพียงการนำไปใช้งานของjavax.ws.rs.core.Response.StatusTypeอินเทอร์เฟซ คุณเพียงแค่ต้องสร้างการประยุกต์ใช้ enum ของคุณเองพร้อมคำจำกัดความสำหรับรหัสสถานะที่คุณต้องการ

ห้องสมุดหลักเช่น javax, เจอร์ซีย์และอื่น ๆ ถูกเขียนถึงอินเตอร์เฟซที่ StatusTypeไม่ได้ดำเนินการ Status (หรือพวกเขาอย่างแน่นอนควรจะ) เนื่องจาก enum สถานะใหม่ของคุณใช้StatusTypeมันสามารถใช้ได้ทุกที่ที่คุณต้องการใช้javax.ws.rs.core.Response.Statusค่าคงที่

เพียงจำไว้ว่ารหัสของคุณควรถูกเขียนไปยังStatusTypeอินเทอร์เฟซ สิ่งนี้จะช่วยให้คุณสามารถใช้ทั้งรหัสสถานะของคุณพร้อมกับรหัส "มาตรฐาน"

นี่คือส่วนสำคัญที่มีการใช้งานง่ายพร้อมค่าคงที่ที่กำหนดไว้สำหรับรหัสสถานะ "ข้อมูล 1xx": https://gist.github.com/avendasora/a5ed9acf6b1ee709a14a


5

ใช้คลาส javax.servlet.http.HttpServletResponse

ตัวอย่าง:

javax.servlet.http.HttpServletResponse.SC_UNAUTHORIZED //401
javax.servlet.http.HttpServletResponse.SC_INTERNAL_SERVER_ERROR //500

4
สำหรับการพัฒนาไคลเอนต์มันเป็นภาระที่ต้องรวมทั้ง servlet API เพียงเพื่อรับรหัสเหล่านี้
Jeffrey Blattman

1
มันอาจเป็นภาระสำหรับบางกรณี แต่ฉันได้พบคำตอบที่ดีนี้และฉันกำลังเขียนแอปพลิเคชันบนเว็บที่ใช้ servlet ดังนั้นจึงดีสำหรับฉัน
Andrei Rînea

2
คำตอบที่ซ้ำกันโพสต์ในอีกสามปีต่อมา? ควรลบทิ้ง
zb226

4

1) เพื่อรับข้อความเหตุผลหากคุณมีรหัสเท่านั้นคุณสามารถใช้:

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

ไหนhttpCodeจะเป็นรหัสเหตุผลที่คุณได้จากการตอบสนองของ HTTP

ดูhttps://hc.apache.org/httpcomponents-core-ga/httpcore/apidocs/org/apache/http/impl/EnglishReasonPhraseCatalog.htmlสำหรับรายละเอียด

2) เพื่อให้ได้เหตุผลรหัสBasicHttpResponseถ้าคุณมีเพียงข้อความที่คุณสามารถใช้

ดูรายละเอียดได้ที่นี่: https://hc.apache.org/httpcomponents-core-ga/httpcore/apidocs/org/apache/http/message/BasicHttpResponse.html


2

ตรวจสอบคลาสสถานะ Restlet ด้วย:

http://www.restlet.org/documentation/1.1/api/org/restlet/data/Status.html


อีกครั้ง; รหัสสถานะสามารถขยายได้ดังนั้นจึงไม่มีรายการ "สมบูรณ์" เว้นแต่จะมีการแก้ไขทุกครั้งที่มีการเพิ่มรหัสสถานะใหม่ลงในรีจิสทรีของ IANA ( iana.org/assignments/http-status-codes )
Julian Reschke

0

ผู้ให้บริการที่ดีที่สุดสำหรับค่าคงที่ของรหัสสถานะ HTTP น่าจะเป็นคลาส org.eclipse.jetty.jetty.http.HttpStatus ของ Jetty เนื่องจาก:

  • มีแพ็กเกจ javadoc ใน maven ซึ่งมีความสำคัญถ้าคุณค้นหาค่าคงที่และรู้จำนวนเท่านั้น -> เพียงแค่เปิดหน้า api docs และค้นหาหมายเลข
  • ค่าคงที่มีหมายเลขรหัสสถานะเอง

สิ่งเดียวที่ฉันจะปรับปรุง: ใส่หมายเลขรหัสสถานะไว้ด้านหน้าคำอธิบายข้อความเพื่อให้การค้นหาอัตโนมัติเสร็จสมบูรณ์ยิ่งขึ้นเมื่อคุณเริ่มต้นด้วยรหัส


-1

อีกทางเลือกหนึ่งคือการใช้HttpStatusคลาสจาก Apache Commons-httpclient ซึ่งจะให้สถานะ Http ต่างๆเป็นค่าคงที่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.