Ich möchte ein Servlet schreiben, das eine HTTP-Antwort wie folgt zurückgibt:
%Vor%Der Grund ist, dass ich möchte, dass ein programmgesteuerter Client die Antwortnachricht verarbeiten kann, um eine bestimmte Antwort zu erhalten, aber ich möchte auch den Antworttext mit einer längeren Erklärung ausfüllen, so dass es einfach ist, mit einem Browser zu klicken / p>
Nun hat HttpServletResponse eine Methode sendError (int, String), mit der ich den Fehlercode und eine Nachricht angeben kann. Die Javadocs sagen nur, dass die Nachricht in irgendeine Art von HTML-Seite eingebettet wird, aber nichts über das Setzen der HTTP-Antwortnachricht. Nachdem Sie diese Methode aufgerufen haben, dürfen Sie nichts mehr in die Antwort schreiben. In meinen Tests (mit Anlegesteg) wird die Nachricht sowohl für die HTTP-Antwort als auch für einen HTML-Text verwendet, was für mich in Ordnung wäre, außer dass ich zwei verschiedene Zeichenfolgen angeben möchte und die Einstellung der http-Antwort nicht denke Nachricht wird mit einer anderen Implementierung garantiert.
Es gibt auch eine setStatus (int) -Methode, die Sie mit beliebigem Code aufrufen können, und dann können Sie Ihren eigenen HTML-Text schreiben. Dies ist nahe, außer dass Sie die HTTP-Antwortnachricht nicht angeben können.
Schließlich gibt es eine setStatus (int, String) -Methode, die tatsächlich genau das tut, was ich will, aber wegen einiger Unklarheiten veraltet ist. Ich nehme an, dass einige Servlet-Container die Nachricht in den Antworttext geschrieben und die Antwort geschlossen haben.
Abgesehen davon, dass ich die veraltete Methode verwende, gehe ich davon aus, dass ich hier versaut bin, aber ich bin neugierig, ob jemand andere Tricks kennt?
Es gibt auch eine setStatus (int) -Methode, die Sie mit beliebigem Code aufrufen können, und dann können Sie Ihren eigenen HTML-Text schreiben. Dies ist nahe, außer dass Sie die HTTP-Antwortnachricht nicht angeben können.
Gibt es einen Grund, warum Sie response.setStatus(500)
nicht verwenden würden, um den HTTP-Statuscode festzulegen, gefolgt vom Schreiben in den Ausgabestream der Antwort?
So wird "Schreiben in den Antworttext" auf der untersten Ebene erreicht.
Hier ist ein Beispiel:
%Vor%web.xml:
%Vor%Und die Ausgabe:
%Vor%Nun, Entschuldigung, der offensichtlichste Grund, einen Body für eine Fehlerreaktion zu haben, besteht darin, etwas Menschenlesbares in einem Browser anzuzeigen, wenn ein Fehler auftritt. Aus diesem Grund ist das Generieren von HTML das Standardverhalten von sendError in der Servlet-Spezifikation.
In meinem Fall möchte ich etwas anderes, weil ich Webdienste erstelle, und diese konkrete gibt keine Antwort zurück, wenn alles gut funktioniert.
Scheint so, als ob alle APIs, die für die Einstellung der Grundphrase in HTTP entworfen wurden, aus diesem Grund obsolet werden:
RFC 7230, Hypertext-Übertragungsprotokoll (HTTP / 1.1): Nachrichtensyntax und Routing , Juni 2014. Abschnitt 3.1.2 :
Das Grundphrase-Element existiert nur zu dem Zweck, zu liefern eine Textbeschreibung, die dem numerischen Statuscode zugeordnet ist, meist aus Respekt gegenüber früheren Internet-Anwendungsprotokollen Diese wurden häufiger bei interaktiven Textclients verwendet. A Der Client sollte den Inhalt der Grundphrase ignorieren .
Tomcat hat die Unterstützung für org.apache.coyote.USE_CUSTOM_STATUS_MSG_IN_HEADER
-Eigenschaft in Version 8.5.0 entfernt.
Mit JBoss 6 kam ich zu dem Schluss, dass der Antwortcode gesetzt werden muss, nachdem Sie getWriter aufgerufen haben, um die Jboss-Antwort auf die benutzerdefinierte Fehlerseite zu deaktivieren. Ich denke, dass die Implementierung verschiedene Schreiber abhängig vom Status der Antwort zur Verfügung stellt.
%Vor%Tags und Links java servlets httpresponse