2016-07-09 33 views
-2

Ich schreibe einen RESTful Web Service. Technologies, die ich benutze:Wie aktivieren/deaktivieren Sie HTTP-Methoden für RESTful Web Service?

  • Eclipse-EE Kepler IDE
  • Glassfish 3 (basierend auf Java 6)
  • Jersey
  • JDK v7

Wenn ich mit einer Java-Methode mit Anmerkungen versehen, zum Beispiel die @DELETE Annotation Ich bekomme den folgenden HTTP-Fehler (über URI aufgerufen):

Ich würde gerne wie aktivieren/deaktivieren (so dass zum Aktivieren/Deaktivieren der oben genannten HTTP-Fehler) diese Methoden (PUT, HEAD, etc.) und auf welcher Ebene kann es getan werden (Glassfish, Web.xml usw.). Können Sie alle diese Ressourcenmethoden (mit HTTP-Methodentyp annotiert) entweder über den URI des Webbrowsers, über die <form> oder über die eigenständige Clientanwendung (ohne Browser) aufrufen?

Zum Beispiel, ob die folgende Konfigurationszeile auf Deployment Descriptor vorhanden ist, macht es keinen Unterschied:

<security-constraint> 
<web-resource-collection> 
    <web-resource-name>RESTfulServiceDrill</web-resource-name> 
    <url-pattern>/drill/rest/resource/*</url-pattern> 
    <http-method>DELETE</http-method> 
</web-resource-collection> 

Natürlich kann man die eine bestimmte Ressource Methode deaktivieren, indem Sie eine Ausnahme zu werfen von ihm (und es zu einem HTTP-Fehler zuordnen) als Hinweis darauf. Dies würde bedeuten, dass die Implementierung beispielsweise nicht verfügbar ist.

Bisher arbeiten nur die Ressourcenmethoden @GET und @POST (auf der <form>), die anderen annotierten Methoden wie @POST (über URI), @PUT, @DELETE, @OPTIONS gibt den obigen HTTP-Fehler zurück . Und hier braucht meine Frage Lösungen. Warum verursachen die erwähnten Ressourcenmethoden einen HTTP-Fehler, wenn die ersten beiden nicht funktionieren?

Ein Beispiel für eine Ressource Methode:

@DELETE 
@Consumes(MediaType.TEXT_PLAIN) 
@Produces(MediaType.TEXT_PLAIN) 
@Path("/getDelete/{value}/{cat}") 
public String getDelete(@PathParam("value") String value, @PathParam("cat") String cat){ 
    return value+" : "+cat; 
} 

Aufrufe URL:

<a href= "/RESTfulServiceDrill/rest/v6/exception/getDelete/Animal/cat">getDelete</a> 

Der Deployment-Deskriptor leer ist, mit Ausnahme der obigen Zeilen von XML-Code. Bisher habe ich die App so implementiert, dass sie mit Annotationen funktioniert, ohne Web.xml (enthält nur einige Standardwerte, z. B. index.jsp-Dateien).

Irgendwelche Ideen da draußen?

+2

Ich verstehe Ihre Frage nicht wirklich. Haben Sie Ihr Projekt im Wesentlichen ausgeführt, d. H. Funktioniert eine Methode Ihrer REST-Klassen? Wenn nicht, gibt es ein Problem mit Ihrer Einrichtung, wenn ja, sollten Sie diese Methode als Beispiel nehmen. Für weitere Hilfe aktualisieren Sie bitte die Frage mit Ihrem vollständigen 'web.xml' und Beispielcode. – unwichtich

+0

Für mich macht Ihre Frage als Ganzes keinen Sinn, daher denke ich, der Grund für alle Down-Stimmen. –

+0

Könnten Sie Beispiele dafür geben, was Sie meinen? Deine Frage ist ziemlich unklar. Sie geben die REST-Methode für den entsprechenden Pfad in Java mit Jersey an. Außerdem - definieren Sie einen GET für diesen Pfad, bevor Sie DELETE definieren? – Signus

Antwort

3

Zu meinem Verständnis, Sie haben Ihre REST-APIs ausgesetzt und Sie versuchen, es für den Zugriff von HTML <form> .Jetzt Sie in der Lage sind, von HTML <form> die Methoden GET und POST (REST APIs) für den Zugriff aber nicht PUT, DELETE und andere HTTP-Methoden .

Der Grund, warum Sie Method Not Allowed Ausnahme erhalten, wenn Sie versuchen, auf DELETE oder PUT oder andere HTTP-Methoden zugreifen, ist HTML <form> unterstützt keine anderen Methoden als GET und POST.

Auch wenn Sie

<form method="delete"> or <form method="put"> 

HTML nicht versuchen, diese Methoden verstehen und betrachten dies als einfach <form> (d) Standardformular Methode GET ist. Also auch Sie haben Methode als DELETE oder PUT erwähnt. Es ist eine GET-Anfrage.

Und wenn der Aufruf erfolgt, versucht der Jersey-Container, den Requestpath (hier "/getDelete/{value}/{cat}") mit der angegebenen Methode (hier GET) zu finden. Obwohl dieser Pfad existiert, haben Sie DELETE als akzeptable Methode in Ihrer Ressource erwähnt (@DELETE-Anmerkung sagt dies). Aber Jersey sucht jetzt nach GET. Da es @GET nicht finden kann, gibt es Method not allowed Exception zurück.

Also, wie man es löst?

In HTML <form> können Sie andere HTTP-Methoden als GET und POST verwenden. Es ist besser, einen Wrapper zwischen der REST-Ebene und HTML zu haben. Damit Sie einen POST-Aufruf von Ihrem HTML-Code aus vornehmen können, behandelt der Wrapper diesen Aufruf und ruft den DELETE des REST-Layers auf.

Und, warum POST-Methode funktioniert nicht vom Browser ist, standardmäßig Browser einen GET-Aufruf. Sehen Sie sich Postman an, um REST-Aufrufe mit verschiedenen Http-Methoden durchzuführen.

+0

Was der Wrapper ist, die Anrufe behandelt? Ist es die Implementierung von Javascript Framework oder einer anderen Art von Client, wie URL-basiert (in Java 6) oder spezifische Client-Bibliothek in Java 7? Zusammenfassend heißt das, dass Sie GET ('') und POST (nur aus '') Methoden vom Browser nur als Client aufrufen können, sonst müssen Sie für andere Methoden andere Client-Implementierungen verwenden? – ucas

+1

1) Besser von HTML aufrufen Servlet oder JSP, die DELETE aufrufen. 2) In HTML-Form können Sie nur GET und POST verwenden .. (Formular-Methode könnte entweder GET oder Post sein) 3) Vom Browser wie Chrom, können Sie nur GET-Aufrufe machen. – Jeevi

+0

Das war alles, was ich brauchte, mehr oder weniger. Die bereitgestellten Informationen sind jetzt zufriedenstellend. Könnte jemand die -1s rausnehmen. – ucas