La meilleure façon de mettre en œuvre la méthode des OPTIONS dans les autres services
Je suis en train de faire une application REST. J'ai fait la GET
méthode sans problèmes, cependant, lorsque je mettre en œuvre le POST
méthode, il est dit que je n'ai pas le OPTIONS
méthode mise en œuvre pour cela. Je suis en train de faire la OPTIONS
méthode pour URI:
http://192.168.1.26:8080/sellAppWeb/api/object/
J'ai le POST
et OPTIONS
méthodes:
@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();
}
Puis je me suis fait la DELETE
méthode et encore, il dit que je n'ai pas de OPTIONS
méthode. Ensuite, j'ai besoin de faire un autre OPTIONS
méthode, qui a un ID
dans l'URI fin. Par exemple pour supprimer un objet avec id = 3
:
http://192.168.1.26:8080/sellAppWeb/api/object/3
J'ai besoin d'avoir un autre OPTIONS
avec la même structure de 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();
}
Quelqu'un aurait-il un moyen de faire un générique OPTIONS
pour toutes les requêtes REST?
l'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>
Quand je fais un POST ou EFFACEZ la demande, la demande de faire automatiquement une demande d'OPTIONS avant.
OriginalL'auteur Eduardo Vendruscolo | 2015-09-02
Vous devez vous connecter pour publier un commentaire.
Vous n'avez pas besoin de implémente l'
OPTIONS
HTTP VERBE dans ce cas. Depuis que vous utilisez RESTEasy, qui est le JAX-RS de mise en œuvre utilisées par Wildfly, le problème que j'ai rencontré était en raison de la servlet-mapping surweb.xml
.J'ai rencontré quand j'ai ajouté le JAX-RS facette sur Eclipse et dites-lui de mettre à jour le
web.xml
. Par défaut généréweb.xml
contenant le repos de l'application de cartographie n'est pas une carte de votre demande correctement, votre Réparateur chemin d'accès aux ressources.C'est de cette façon la web.xml devrait ressembler, à condition que vous n'avez pas créé votre propre
Application
.Assurez-vous que votre
<servlet-name>
et<servlet-mapping>
sont mappés comme dans l'exemple ci-dessus. Si l'extension de l'Application
classe, il suffit de le préciser dans votreweb.xml
au lieu de la valeur par défautApplication
comme indiqué ci-dessus.Aussi, votre
@POST
méthode, il est recommandé de spécifier le type de ressource de votre Réparateur de données (dans votre cas, votre DTO) à l'aide de@Consumes
annotation.Par exemple.
Quelle erreur donne-t-il de vous? Le mien fonctionne COMME EST.
org.jboss.resteasy.le spi.DefaultOptionsMethodException: Aucune ressource méthode trouvée pour les options, retour OK avec Permettre d'en-tête
Je vois que vous êtes en utilisant RESTEasy spécifier la configuration. Pouvez-vous poster le stacktrace en tant que bien de sorte que nous puissions voir ce qui se passe? Aussi, ce que vous obtenez lorsque vous accéder au lien
http://192.168.1.26:8080/sellAppWeb/api/
?j'obtiens cette erreur, mais j'ai ce qu'il est correct. parce que je n'ai pas de chemin mappés à cette adresse
<response> <message> Could not find resource for full path: http://192.168.1.103:8080/sellAppWeb/api/ </message> </response>
OriginalL'auteur Buhake Sindi
Absolument, cela sonne comme un CORS (Cross Origin Resource sharing) problème. Vous pouvez en lire plus à ce sujet à HTTP de contrôle d'accès (SCRO). Fondamentalement, les OPTIONS de demande de contrôle en amont avant la demande réelle. Ce sera le cas pour certains types de requêtes AJAX.
Pour cela, RESTeasy a la
CorsFilter
vous pouvez vous inscrire. Vous devez configurer le filtre pour les paramètres que vous souhaitez autoriser. Voir aussi un exemple ici pour le configurer.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");
Ajouter une instruction print dans le filtre du constructeur afin de vérifier qu'elle a créé. Deuxième faire une simple requête GET, et regardez les en-têtes pour s'assurer qu'ils sont là. Si vous ajoutez des en-têtes à toutes les demandes (tant que vous êtes dans votre filtre), les en-têtes doivent montrent même pour les requêtes GET. La bonne chose à propos RESTesy du filtre, c'est qu'il est mis en œuvre pour envoyer uniquement les en-têtes de réponse pour le contrôle en amont (OPTIONS) demande, de sorte que les en-têtes ne sont pas envoyés pour toutes les demandes. Ce n'est pas un problème si les en-têtes sont fixés pour toutes les réponses, c'est juste la réponse un peu légère.
Vous pouvez également vouloir tout essayer et utiliser RESTeasy du filtre au lieu de votre propre.
Oui, le constructeur de l'impression dans la console lors de sa création, la réponse d'une simple Requête GET, est
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
S'il vous plaît essayer et utiliser le filtre RESTeasy
OriginalL'auteur Paul Samsotha
J'ai essayé RestEasy de CorsFilter mais les appels effectués avec la méthode des OPTIONS de retour
J'ai écrit un simple filtre:
Voici le code. C'est une version simplifiée, ditry - mais efficace. Hésitez pas à affiner le filtre si vous souhaitez retourner un 200 lors de l'interrogation d'un "vrai" point de terminaison.
De ce post et mon préféré de la SCRO explication.
OriginalL'auteur otonglet
Je vous recommande d'utiliser le Printemps des Contrôleurs et des RequestMapping annotations, ils sont vraiment faciles à utiliser:
Vous n'avez pas besoin de mettre en œuvre les OPTIONS de méthodes, il suffit de déclarer votre méthode et l'utilisation de l'annotation de la définir comme un POST/GET/PUT/DELETE demande de la méthode.
Ici sont beaucoup d'exemples.
oui, je suis en utilisant Wildfly implémentations.
OriginalL'auteur melli-182
Pour moi, c'était la seule façon de faire le travail.
Créer la classe en java restclient projet.
OriginalL'auteur Felipe SS
Vous pouvez utiliser @Path("{path:.*}").
OriginalL'auteur lianjm