J'utilise jersey comme application api reposante. Au début, j'utilise le service angularjs $ http pour faire une requête http. Lorsque je demande une méthode de suppression, j'ai toujours l'erreur ci-dessous.
"Method DELETE is not allowed by Access-Control-Allow-Methods in preflight response."
J'ai lu quelques articles et ils disent que je dois autoriser la suppression sur "Access-Control-Allow-Methods". J'ai configuré le filtre de réponse comme indiqué ci-dessous, mais le problème persiste. Que dois-je faire d'autre?
@Provider
public class CORSResponseFilter implements ContainerResponseFilter {
@Override
public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {
MultivaluedMap<String, Object> headers = responseContext.getHeaders();
headers.add("Access-Control-Allow-Origin", "*");
headers.add("Access-Control-Allow-Methods", "*");
}
}
ci-dessous est mon code angulaire pour faire la demande:
$http({
method: 'DELETE',
url: remoteUrl,
headers : {'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8',
'ACCESS_TOKEN' : $cookieStore.get("access_token")
},
data : $httpParamSerializer({
'id':id
})
}).success(function(data,status,headers,config) {
$scope.refreshDepartments();
console.log(data);
alert("success");
}).error(function(data,status,headers,config){
console.log(data);
alert("error");
});
Après quelques essais, j'ai trouvé la solution. Je mets la méthode allow sur l'en-tête comme ci-dessous, alors cela fonctionne. Je ne sais pas pourquoi "*" ne fonctionne pas.
headers.add("Access-Control-Allow-Methods", "GET, POST, OPTIONS, PUT, DELETE");
Essayez d’utiliser l’extension CORS pour le chrome, cela m’a aidé une fois.
MODIFIER
Cela se produit car angular ajoute des clés X-Header dans vos en-têtes de requête.
Les en-têtes X définissent ou définissent généralement les paramètres de fonctionnement pour les requêtes HTTP.
Vous pouvez résoudre ce problème en modifiant le type de contenu de vos requêtes en "text/plain" ou "application/x-www-form-urlencoded" ou "multipart/form-data".
Vous pouvez le faire en utilisant un intercepteur dans la configuration de votre application.
MODIFIER
Ajoutez ceci à votre code serveur -
header('Access-Control-Allow-Headers: X-Requested-With');
Essayez de changer le type de contenu en text/plain
J'espère que cela t'aides.