Are Java un enum complet pentru codurile de răspuns HTTP? (Programare, Java, Http)

Zoltan Szilagyi a intrebat.

Mă întreb dacă există un tip enum în vreo bibliotecă standard de clase Java care definește constante simbolice pentru toate codurile de răspuns HTTP valide. Ar trebui să suporte conversia la/de la valorile întregi corespunzătoare.

Depanez un cod Java care utilizează javax.ws.rs.core.Response.Status. Funcționează, dar definește doar aproximativ jumătate din codurile de răspuns HTTP valabile.

12 răspunsuri
John Feminella

Nu cred că există unul care să fie complet în clasele Java standard; HttpURLConnection lipsesc destul de multe coduri, cum ar fi HTTP 100/Continue.

Există o listă completă în Apache HttpComponents, totuși:
org.apache.http.HttpStatus (înlocuit org.apache.commons.HttpClient.HttpStatus din Apache Http Client, care a ajuns la sfârșit de viață)

Comentarii

  • Nu există o „listă completă”, deoarece codurile de stare pot fi și sunt extinse. –  > Por Julian Reschke.
  • 21

  • @JulianReschke Cred că „complet” aici ar trebui să însemne „este conform cu toate codurile descrise în standard”. –  > Por John Feminella.
  • John: „standardul” nu definește „toate” codurile de stare. De aceea există un registru. –  > Por Julian Reschke.
  • iana.org/assignments/http-status-codes/http-status-codes.xml au o listă mare care include codul=100 –  > Por Garis M Suero.
  • @Donal: din nou, nu este o listă bună. Ceea ce este relevant este registrul IANA. –  > Por Julian Reschke.
David Rabinowitz

Interfața javax.servlet.http.HttpServletResponse din API-ul servlet are toate codurile de răspuns sub formă de int nume de constante SC_<description>. A se vedea http://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpServletResponse.html

Comentarii

  • HttpServletResponse suportă standardele RFC1945 și o parte din RFC2616, dar îi lipsește tot RFC2518. Dacă aveți nevoie de o listă completă, consultați HttpStatus, așa cum am menționat. –  > Por John Feminella.
  • De asemenea, HttpServletResponse nu conține codul de răspuns 418 definit în RFC 2324 –  > Por daiscog.
  • Utilizarea HttpServletResponse în orice lucru care rulează în afara unui servlet este posibil să ducă la probleme de dependență de diamante din cauza suprapunerii claselor în diferite artefacte servlet. –  > Por Elliotte Rusty Harold.
Mystic

Ei bine, există constante statice ale valorilor exacte ale numerelor întregi din HttpURLConnection clasa

Comentarii

  • thx! acest lucru funcționează fără nicio dependență externă. java.net.HttpURLConnection.HTTP_BAD_REQUEST –  > Por comonad.
  • Este bine că face parte din biblioteca standard, dar din păcate este incompletă – în intervalul 400, de exemplu, se întrerupe la 415. –  > Por tschumann.
Ed J

Dacă folosiți Spring, versiunea 3.x are ceea ce căutați:http://static.springsource.org/spring/docs/3.0.x/api/org/springframework/http/HttpStatus.html

Comentarii

  • Aș dori să adaug că Springs org.springframework.http.HttpStatus (docs.spring.io/spring/docs/current/javadoc-api/org/…) enum, este singurul pe care l-am putut găsi care oferă documentație Java cu linkuri către lista completă a codurilor de stare și utilizarea lor în fiecare enum. Dacă folosiți deja Spring, atunci aceasta ar fi biblioteca pe care ar trebui să o utilizați. –  > Por lastmannorth.
  • Are 100 și 418. Păcat că trebuie să apelați HttpStatus.XXX.value() pentru a obține int. –  > Por WesternGun.
David Avendasora

Toată lumea pare să ignore partea „enum type” din întrebarea ta.

Deși nu există o sursă canonică pentru codurile de stare HTTP, există o modalitate simplă de a adăugați orice constante de stare lipsă de care aveți nevoie la cele furnizate de javax.ws.rs.core.Response.Status fără a adăuga dependențe suplimentare la proiectul dumneavoastră.

javax.ws.rs.core.Response.Status este doar o implementare a javax.ws.rs.core.Response.StatusType interfață. Trebuie pur și simplu să vă creați propria implementare enum cu definiții pentru codurile de stare pe care le doriți.

Bibliotecile de bază, cum ar fi Javax, Jersey etc., sunt scrise în interfața StatusType nu la implementare Status (sau cu siguranță ar trebui să o facă să fie). Din moment ce noul enum Status implementează StatusType poate fi utilizată oriunde ați utiliza un javax.ws.rs.core.Response.Status constantă.

Amintiți-vă doar că propriul dvs. cod ar trebui să fie, de asemenea, scris la StatusType interfața. Acest lucru vă va permite să utilizați atât propriile coduri de stare, cât și codurile „standard”.

Iată o listă cu o implementare simplă cu constante definite pentru „Informational 1xx”. Coduri de stare: https://gist.github.com/avendasora/a5ed9acf6b1ee709a14a

Andrejs

Dacă utilizați Netty, puteți folosi:

Comentarii

  • din păcate, acesta nu este un enum și, prin urmare, nu poate fi utilizat în declarațiile de caz (ceea ce mă întristează) –  > Por Frederick Roth.
Andrés Canavesi

Utilizați clasa javax.servlet.http.HttpServletResponse

Exemplu:

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

Comentarii

  • pentru dezvoltarea clienților, este împovărător să includeți întreaga API a servletului doar pentru a prelua aceste coduri. –  > Por Jeffrey Blattman.
  • Ar putea fi împovărător pentru unele cazuri, dar am găsit acest răspuns bun și scriu o aplicație web bazată pe servlet, așa că este bun pentru mine. –  > Por Andrei Rînea.
  • Un răspuns duplicat, postat peste trei ani mai târziu? Ar trebui să fie șters. –  > Por zb226.
Maira Bay

1) Pentru a obține motivul trimiteți un SMS la dacă aveți doar codul, îl puteți folosi:

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

Unde httpCode ar fi codul motivului pe care l-ați obținut din răspunsul HTTP.

A se vedea https://hc.apache.org/httpcomponents-core-ga/httpcore/apidocs/org/apache/http/impl/EnglishReasonPhraseCatalog.html pentru detalii

2) Pentru a obține motivul cod dacă aveți doar textul, puteți utiliza BasicHttpResponse.

Pentru detalii, consultați aici: https://hc.apache.org/httpcomponents-core-ga/httpcore/apidocs/org/apache/http/message/BasicHttpResponse.html

Greg Noe

Comentarii

  • Din nou; codurile de stare sunt extensibile, astfel încât nu poate exista o listă „completă”, cu excepția cazului în care aceasta este revizuită de fiecare dată când un nou cod de stare este adăugat la registrul IANA (iana.org/assignments/http-status-codes) –  > Por Julian Reschke.
Christian S.

Iată un enum cu codurile de stare și descrierile acestora care (la momentul redactării) corespunde cu Registrul codurilor de stare HTTP.

Rețineți că registrul ar putea fi actualizat și că, uneori, sunt utilizate coduri de stare neoficiale.

public enum HttpStatusCode {

    //1xx: Informational
    CONTINUE(100, "Continue"),
    SWITCHING_PROTOCOLS(101, "Switching Protocols"),
    PROCESSING(102, "Processing"),
    EARLY_HINTS(103, "Early Hints"),

    //2xx: Success
    OK(200, "OK"),
    CREATED(201, "Created"),
    ACCEPTED(202, "Accepted"),
    NON_AUTHORITATIVE_INFORMATION(203, "Non-Authoritative Information"),
    NO_CONTENT(204, "No Content"),
    RESET_CONTENT(205, "Reset Content"),
    PARTIAL_CONTENT(206, "Partial Content"),
    MULTI_STATUS(207, "Multi-Status"),
    ALREADY_REPORTED(208, "Already Reported"),
    IM_USED(226, "IM Used"),

    //3xx: Redirection
    MULTIPLE_CHOICES(300, "Multiple Choice"),
    MOVED_PERMANENTLY(301, "Moved Permanently"),
    FOUND(302, "Found"),
    SEE_OTHER(303, "See Other"),
    NOT_MODIFIED(304, "Not Modified"),
    USE_PROXY(305, "Use Proxy"),
    TEMPORARY_REDIRECT(307, "Temporary Redirect"),
    PERMANENT_REDIRECT(308, "Permanent Redirect"),

    //4xx: Client Error
    BAD_REQUEST(400, "Bad Request"),
    UNAUTHORIZED(401, "Unauthorized"),
    PAYMENT_REQUIRED(402, "Payment Required"),
    FORBIDDEN(403, "Forbidden"),
    NOT_FOUND(404, "Not Found"),
    METHOD_NOT_ALLOWED(405, "Method Not Allowed"),
    NOT_ACCEPTABLE(406, "Not Acceptable"),
    PROXY_AUTHENTICATION_REQUIRED(407, "Proxy Authentication Required"),
    REQUEST_TIMEOUT(408, "Request Timeout"),
    CONFLICT(409, "Conflict"),
    GONE(410, "Gone"),
    LENGTH_REQUIRED(411, "Length Required"),
    PRECONDITION_FAILED(412, "Precondition Failed"),
    REQUEST_TOO_LONG(413, "Payload Too Large"),
    REQUEST_URI_TOO_LONG(414, "URI Too Long"),
    UNSUPPORTED_MEDIA_TYPE(415, "Unsupported Media Type"),
    REQUESTED_RANGE_NOT_SATISFIABLE(416, "Range Not Satisfiable"),
    EXPECTATION_FAILED(417, "Expectation Failed"),
    MISDIRECTED_REQUEST(421, "Misdirected Request"),
    UNPROCESSABLE_ENTITY(422, "Unprocessable Entity"),
    LOCKED(423, "Locked"),
    FAILED_DEPENDENCY(424, "Failed Dependency"),
    TOO_EARLY(425, "Too Early"),
    UPGRADE_REQUIRED(426, "Upgrade Required"),
    PRECONDITION_REQUIRED(428, "Precondition Required"),
    TOO_MANY_REQUESTS(429, "Too Many Requests"),
    REQUEST_HEADER_FIELDS_TOO_LARGE(431, "Request Header Fields Too Large"),
    UNAVAILABLE_FOR_LEGAL_REASONS(451, "Unavailable For Legal Reasons"),

    //5xx: Server Error
    INTERNAL_SERVER_ERROR(500, "Internal Server Error"),
    NOT_IMPLEMENTED(501, "Not Implemented"),
    BAD_GATEWAY(502, "Bad Gateway"),
    SERVICE_UNAVAILABLE(503, "Service Unavailable"),
    GATEWAY_TIMEOUT(504, "Gateway Timeout"),
    HTTP_VERSION_NOT_SUPPORTED(505, "HTTP Version Not Supported"),
    VARIANT_ALSO_NEGOTIATES(506, "Variant Also Negotiates"),
    INSUFFICIENT_STORAGE(507, "Insufficient Storage"),
    LOOP_DETECTED(508, "Loop Detected"),
    NOT_EXTENDED(510, "Not Extended"),
    NETWORK_AUTHENTICATION_REQUIRED(511, "Network Authentication Required");

    private final int value;
    private final String description;

    HttpStatusCode(int value, String description) {
        this.value = value;
        this.description = description;
    }

    public int getValue() {
        return value;
    }

    public String getDescription() {
        return description;
    }

    @Override
    public String toString() {
        return value + " " + description;
    }

    public static HttpStatusCode getByValue(int value) {
        for(HttpStatusCode status : values()) {
            if(status.value == value) return status;
        }
        throw new IllegalArgumentException("Invalid status code: " + value);
    }
}

user1050755

Cel mai bun furnizor pentru constantele codurilor de stare http este probabil să fie clasa org.eclipse.jetty.http.HttpStatus de la Jetty, deoarece:

  • există un pachet javadoc în maven care este important dacă căutați constanta și știți doar numărul -> doar deschideți pagina api docs și căutați numărul
  • constantele conțin chiar numărul codului de stare.

Singurul lucru pe care l-aș îmbunătăți: puneți numărul codului de stare în fața descrierii textului pentru a face căutarea prin autocompletare mai convenabilă atunci când începeți cu codul.

ak123

O altă opțiune este de a utiliza HttpStatus class from the Apache commons-httpclient care vă oferă diferitele statusuri Http ca și constante.

Tags:,