Beste Art der Umsetzung der Methode OPTIONEN in REST-Dienste
Mache ich eine REST-Anwendung. Ich habe die GET
Methode ohne Probleme, jedoch wenn ich die Umsetzung der POST
Methode, es sagt, dass ich nicht die OPTIONS
- Methode implementiert. Ich mache die OPTIONS
Methode für URI:
http://192.168.1.26:8080/sellAppWeb/api/object/
Habe ich die POST
und OPTIONS
Methoden:
@OPTIONS
@Produces("application/json; charset=UTF-8")
public Response options() {
return Response.ok().build();
}
@Override
@POST
public Response save(CervejaDTO cervejaDTO) {
cervejaController.register(cervejaDTO);
return Response.ok(cervejaDTO).build();
}
Dann bin ich aus der DELETE
Methode und immer wieder sagt, dass ich nicht OPTIONS
Methode. Dann muss ich ein anderes machen OPTIONS
Methode, die eine ID
im URI Ende. Zum Beispiel löschen Sie ein Objekt mit id = 3
:
http://192.168.1.26:8080/sellAppWeb/api/object/3
Brauche ich, um ein anderes OPTIONS
mit der gleichen Struktur DELETE
URI:
@OPTIONS
@Path("/{id}")
@Produces("application/json; charset=UTF-8")
public Response optionsDelete(@PathParam("id") Integer id) {
return Response.ok().build();
}
@Override
@POST
public Response save(CervejaDTO cervejaDTO) {
cervejaController.register(cervejaDTO);
return Response.ok(cervejaDTO).build();
}
Kennt jemand einen Weg, um eine generische OPTIONS
für alle ÜBRIGEN Anfragen?
den web.xml:
<display-name>Testes de serviços REST</display-name>
<description>Testes de serviços REST</description>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
<context-param>
<param-name>resteasy.scan</param-name>
<param-value>true</param-value>
</context-param>
<context-param>
<param-name>resteasy.servlet.mapping.prefix</param-name>
<param-value>/api</param-value>
</context-param>
<context-param>
<param-name>resteasy.providers</param-name>
<param-value>br.com.sell.app.exception.handler.DefaultExceptionHandler</param-value>
</context-param>
<listener>
<listener-class>org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap</listener-class>
</listener>
<servlet>
<servlet-name>resteasy-servlet</servlet-name>
<servlet-class>org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>resteasy-servlet</servlet-name>
<url-pattern>/api/*</url-pattern>
</servlet-mapping>
Wenn ich einen POST zu machen oder LÖSCHEN-Anfrage, die Anwendung automatisch eine OPTIONS-Anfrage vor.
InformationsquelleAutor Eduardo Vendruscolo | 2015-09-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sie nicht brauchen, um implementiert der
OPTIONS
HTTP-VERB, in diesem Fall. Da bist du mit RESTEasy, welche die JAX-RS Implementierung verwendet, die von Wildfly, das Problem, das ich gestoßen war aufgrund der servlet-mapping aufweb.xml
.Habe ich festgestellt, wenn ich fügte hinzu, die JAX-RS-Facette auf Eclipse und sagen, es zu aktualisieren
web.xml
. Die standardmäßig generiertweb.xml
mit der Restful-Anwendung mapping nicht ordnen Sie Ihre Anwendung richtig zu Ihrem Erholsamen Ressource Pfad.Dies ist, wie die web.xml Aussehen sollte, sofern Sie nicht erstellt haben Ihre eigenen
Application
.Stellen Sie sicher, dass Ihre
<servlet-name>
und<servlet-mapping>
zugeordnet werden, wie im obigen Beispiel. Wenn Sie erweiterte dieApplication
Klasse, geben Sie einfach es in Ihreweb.xml
anstelle der Standard -Application
wie oben gezeigt.Auch, Ihre
@POST
Ressource-Methode, ist es empfehlenswert, den Ressourcentyp angeben, von Ihrem Erholsamen Daten (in Ihrem Fall, Ihre DTO) mit@Consumes
annotation.ZB.
Welchen Fehler gibt er dir? Mir arbeitet WIE Sie IST.
org.jboss.resteasy.spi.DefaultOptionsMethodException: Keine Ressource-Methode für Optionen, OK zurück mit Allow-header
Ich sehe, du bist mit RESTEasy angeben Konfiguration. Können Sie nach dem stacktrace, so dass wir sehen können, was passiert? Auch, was bekommen Sie, wenn Sie auf den link
http://192.168.1.26:8080/sellAppWeb/api/
?ich bekomme diese Fehlermeldung, aber ich das es richtig ist. denn ich habe den Pfad zugeordnet, um diese Adresse
<response> <message> Could not find resource for full path: http://192.168.1.103:8080/sellAppWeb/api/ </message> </response>
InformationsquelleAutor Buhake Sindi
Dies ist definitiv klingt wie ein CORS (Cross-Origin Resource Sharing) problem. Lesen Sie mehr darüber auf HTTP access control (CORS). Grundsätzlich ist die OPTIONS-Anforderung ist preflight-Anfrage, bevor die eigentliche Anfrage. Dieses geschehen wird für bestimmte Typen von AJAX-Anfragen.
Dafür, RESTeasy hat die
CorsFilter
können Sie sich registrieren. Konfigurieren Sie den filter, um die Einstellungen, die Sie zulassen möchten. Auch ein Beispiel hier für ein Weg, um es zu konfigurieren.headers.add("Access-Control-Allow-Origin", "*"); headers.add("Access-Control-Allow-Methods", "GET,POST,DELETE,PUT,OPTIONS"); headers.add("Access-Control-Allow-Headers", "Content-Type");
Fügen Sie eine print-Anweisung in der filter-Konstruktor, um sicherzustellen, dass es erstellt. Zweitens machen einen einfachen GET-request, und der Blick auf die überschriften, um sicherzustellen, Sie sind es. Wenn Sie fügen Sie die Header, um alle Anfrage (wie Sie in Ihrem filter), der Header sollte auch für GET-Anforderungen. Die nette Sache über RESTesy filter ist, dass es umgesetzt wird, nur senden Sie die Antwort-Header für die preflight (OPTIONEN) verlangen, so dass der Header nicht gesendet für alle Anforderungen. Es ist nicht ein problem, wenn die Kopfzeilen für alle Antworten, es macht die Antwort etwas leichter.
Vielleicht möchten Sie auch einfach mal versuchen, und verwenden Sie RESTeasy filter anstelle Ihres eigenen.
Ja, der Konstruktor print in der Konsole bei der Erstellung der Antwort einen einfachen GET-Request, ist
Access-Control-Allow-Headers:Content-Type Access-Control-Allow-Methods:GET,POST,DELETE,PUT,OPTIONS Access-Control-Allow-Origin:* Connection:keep-alive Content-Length:994 Content-Type:application/json;charset=UTF-8 Date:Thu, 03 Sep 2015 18:01:11 GMT Server:WildFly/9 X-Powered-By:Undertow/1
Bitte versuchen Sie und verwenden Sie die filter RESTeasy
InformationsquelleAutor Paul Samsotha
Versuchte ich RestEasy ist CorsFilter aber Anrufe mit den OPTIONEN, die Methode der Rückkehr
Schrieb ich einen einfachen filter, der:
Hier ist der code. Dies ist eine vereinfachte version, ditry - aber effizient. Fühlen Sie sich frei, verfeinern Sie den filter, wenn Sie nur wollen, zurück zu senden, einen 200 bei der Abfrage eine "echte" Endpunkt.
Vom dieser Beitrag und meine bevorzugt CORS Erklärung.
InformationsquelleAutor otonglet
Empfehle ich Ihnen, Frühlings-Controller und RequestMapping annotations, Sie sind wirklich einfach zu bedienen:
Brauchen Sie nicht zu implementieren OPTIONEN Methoden, nur erklären Sie Ihre Methode und verwenden Sie die annotation zu definieren, wie ein POST/GET/PUT/DELETE-request-Methode.
Hier viele Beispiele.
ja, ich bin mit Wildfly-Implementierungen.
InformationsquelleAutor melli-182
Das war für mich der einzige Weg, um Arbeit zu tun.
Erstellen Sie die Klasse in Ihre java-restclient Projekt.
InformationsquelleAutor Felipe SS
Können Sie mit @Path("{path:.*}").
InformationsquelleAutor lianjm