Die status zurückkehren Anfrage, ungültige URL für verschiedene http-Methoden?
Wenn eine REST-Anwendung eine Anforderung empfängt, für eine nicht existierende Ressource, sollte es immer wieder ein 404 Nicht Gefunden
?
Sollte es wieder einen anderen status für jeden HTTP-Methoden GET
, HEAD
, POST
, PUT
, DELETE
, OPTIONS
oder TRACE
?
Frühjahr wieder ein 404
für GET
und HEAD
eine 200 OK
für OPTIONS
, und ein 405 Method Not Supported
für die anderen. Ist das falsch?
z.B. Das Spring-Boot-Anwendung zeigt die unterschiedlichen Reaktionen für die Anforderungen an eine mis-typed-URL (Grüße statt Gruß).
@RestController
@SpringBootApplication
public class Application {
private static Logger log = LoggerFactory.getLogger(Application.class);
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
RestTemplate restTemplate = new RestTemplate();
String badUrl = "http://localhost:8080/greetings";
for (HttpMethod httpMethod : HttpMethod.values()) {
try {
restTemplate.execute(badUrl, httpMethod, null, null);
} catch (Exception e) {
log.error("Failed to " + httpMethod + " -- " + e.getMessage());
}
}
}
@RequestMapping("/greeting")
public String greeting() {
return "hello";
}
}
Protokollierten Ausgabe:
Nicht BEKOMMEN -- 404 Nicht Gefunden
Gescheitert-an-KOPF -- 404 Nicht Gefunden
Fehler beim POST -- 405-Methode Nicht Erlaubt
Nicht die STELLEN -- 405-Methode Nicht Erlaubt
Failed to PATCH -- I/O-Fehler auf PATCH-Anforderung für"http://localhost:8080/greetings": "Ungültige HTTP-Methode: PATCH; nested exception is java.net.ProtocolException: Ungültiges HTTP-Methode: PATCH
Fehler beim LÖSCHEN -- 405-Methode Nicht Erlaubt
OPTIONS-Anfrage für "http://localhost:8080/greetings" ergab 200 (OK)
Fehlgeschlagen zu verfolgen -- 405-Methode Nicht Erlaubt
InformationsquelleAutor whistling_marmot | 2016-02-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kurze Antwort: tut Es nicht haben immer zurück
404
. Längere Antwort: Die Angabe scheint bieten einige Optionen für die status-codes zu verwenden. Die Spezifikation auf https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.5 sagt:10.4.5 404 Not Found
Dem server hat nichts gefunden matching der Anfrage-URI. Kein Hinweis darauf gegeben wird, ob die Bedingung temporär oder permanent. Der 410 (Gone) - Statuscode SOLLTE verwendet werden, wenn der server weiß, durch einige intern konfigurierbaren Mechanismus, dass eine alte Ressource dauerhaft nicht erreichbar ist und keine Weiterleitungsadresse. Dieser status-code wird Häufig verwendet, wenn der server nicht wünscht, zeigen genau, warum die Anfrage abgelehnt worden ist, oder wenn keine andere Antwort ist zutreffend.
10.4.6 405 Methode Nicht Erlaubt
Angegebene Methode in der Request-Line ist nicht erlaubt, für die die Ressource identifiziert durch die Request-URI. Die Antwort MUSS enthalten eine Allow-header mit einer Liste der gültigen Methoden für die angeforderte Ressource.
Gibt es etwas Raum für interpretation, wenn für die Verwendung dieser beiden codes. Meine interpretation wäre: Wenn eine Ressource nicht vorhanden ist, noch einige Betrieb möglicherweise könnte immer noch angewendet werden, um die URI, dann ein
405
wäre passender.Beispiel:
Könnte bedeuten, dass, obwohl
GET
ist nicht zulässig, dass insbesondere auf die Ressource (weil es die eigentlich gar nicht existiert), könnte man immer noch machenPUT
arbeiten, wodurch gesagt Ressource in den Prozess.Wohl ein
404
, obwohl erlaubt durch die Angabe, wäre weniger geeignet.Bezüglich
OPTIONS
. Spezifikation ist hier: https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.2 . Gemäß der Spezifikation ist nicht nicht implizieren eine Interaktion mit der Ressource selbst. Es ist mehr eine Abfrage an den server speziell, um festzustellen, welche Methoden wäre "theoretisch" unterstützt, die auf dem angegebenen URI. Es unterstützt zum Beispiel mit einem Platzhalter ("*") Abfrage, die auch wahrscheinlich überhaupt nicht existiert.Ja, genau. Aber, nochmal, in meinem Lesen der Fehlercodes oben gibt es etwas Raum für interpretation, die nicht oder nicht sinnvoll in einer bestimmten situation. Ich glaube nicht, dass die meisten Server oder clients sind bereit, um solche Unterscheidungen zu treffen. In den meisten Situationen ist es vielleicht nicht einmal einen Unterschied machen.
InformationsquelleAutor Robert Bräutigam