1

J'ai un exemple d'application: https://github.com/LateralThoughts/orsyp-frontend-training/tree/master/zupr_trackr. Il expose 3 entités JPA (Company, Employee, Activity) via les ressources REST gérées par Spring DATA/REST.Spring Data/REST - Javascript (jquery, backbone) appels reposants se retrouvent avec une réponse 404

Bien que je peux avec succès interroger l'API REST via un navigateur REST add-on, par exemple, la requête suivante (sur le même domaine ou un autre) renvoie toujours une 404:

$.getJSON("http://localhost:8080/api/companies/") 
    .success(function() { alert("success"); }) 
    .fail(function(event, jqxhr, exception) { 
     console.log(jqxhr, exception); 
    }) 
    .complete(function() { alert("Done"); } 
); 

La seule différence que nous remarqué lors de la comparaison d'une requête HTTP générée (via un additif REST) ​​et un jquery-driven est l'absence de "Referer" dans le premier cas et sa présence dans le dernier. L'ajout de cet en-tête à l'interface du module complémentaire REST provoquera l'échec de la demande, comme décrit plus haut.

Toutes les idées sont les bienvenues, merci à l'avance

Rolf

P.S .: cela est vrai pour GET/POST et d'autres verbes.

+0

Obtenez-vous des exceptions du côté Java? Y a-t-il un message d'erreur plus détaillé dans la réponse HTTP? – elevine

+0

Ce n'est pas la dernière traîne/par hasard est-ce? qui m'est arrivé avant, on ne sait jamais ... –

+0

Salut merci pour vos réponses, ce n'est pas à propos de la barre oblique, les deux URL (avec et sans /) sont toutes les deux servies en procédant manuellement. Je vais définir le niveau LOG ​​à TRACE et voir si je peux détecter une pile. – Rolf

Répondre

1

Spring Data REST n'aime pas les en-têtes Accept envoyés par jQuery.

jQuery envoie ces en-têtes:

Accept:application/json, text/javascript, */*; q=0.01 

Et si vous essayez des requêtes comme ceci:

curl -v -XGET -H "Accept:application/json, text/javascript, */*; q=0.01" http://localhost:8080/api/employees/ 

il échouera comme 404, mais si vous le changez en enlevant la partie text/javascript:

curl -v -XGET -H "Accept:application/json, */*; q=0.01" http://localhost:8080/api/employees/ 

celui-ci fonctionne.

Vous pouvez remplacer les en-têtes Accept par défaut utilisés par jQuery à l'aide de la méthode $.ajaxSetup, ou vous pouvez simplement remplacer ces paramètres lorsque vous interrogez votre API.

$.ajax({ 
    url : "http://localhost:8080/api/employees", 
    accepts: {json:'application/json'} 
}) 

maintenant sur le pourquoi, je pense qu'il ya un problème au printemps de données REST ici:

https://github.com/SpringSource/spring-data-rest/blob/master/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/RepositoryRestHandlerMapping.java#L46

où l'en-tête Accept est adapté, et je pense que cela peut être dû à la fait que text/javascript n'existe pas pour SpringData REST.