J’envoie une demande de publication à une application de service RESTFUL WCF. Je peux envoyer avec succès une demande POST
par le biais de Fiddler.
Toutefois, lorsque je le fais par le biais de la méthode jQuery Ajax, la fonction renvoie les éléments suivants à la console pour développeur Chrome:
OPTIONS http://www.example.com/testservice/service1.svc/GetData 405 (Method Not Allowed) jquery.min.js:6
Mais ensuite une seconde après les logs:
Object {d: "You entered 10"} testpost.html:16
Cela me dit que jQuery envoie une demande OPTIONS
, qui échoue, puis une demande POST
qui renvoie les données attendues.
Mon code jQuery:
$.ajax() { type: "POST", //GET or POST or PUT or DELETE verb url: "http://www.example.com/testservice/service1.svc/GetData", // Location of the service data: '{"value":"10"}', //Data sent to server contentType:"application/json", dataType: "json", //Expected data format from server processdata: false, success: function (msg) {//On Successfull service call console.log(msg); }, error: function (xhr) { console.log(xhr.responseText); } // When Service call fails });
J’utilise jQuery version 2.0.2.
Toute aide sur la raison de cette erreur serait une aide précieuse.
Votre code tente en réalité de faire une demande inter-domaines (CORS) , pas un POST
ordinaire.
C’est-à-dire que les navigateurs modernes n’autoriseront que les appels Ajax aux services du même domaine que la page HTML.
Exemple: une page de http://www.example.com/myPage.html
ne peut demander directement que des services situés sur http://www.example.com
, tels que http://www.example.com/testservice/etc
. Si le service est dans un autre domaine, le navigateur ne passe pas l’appel direct (comme vous le souhaitez). Au lieu de cela, il essaiera de faire une demande CORS.
En bref, pour effectuer une demande CORS, votre navigateur:
OPTION
à l’URL cible OPTION
contient les en- têtes adéquats ( Access-Control-Allow-Origin
est un) pour autoriser la demande CORS, la recherche effectuera l’appel (presque exactement de la même manière que si la page HTML était au même domaine).
Comment le résoudre? Le moyen le plus simple consiste à activer CORS (activer les en-têtes nécessaires) sur le serveur.
Si vous ne disposez pas d’un access côté serveur, vous pouvez mettre en miroir le service Web depuis un autre site, puis y activer le CORS.
Vous devez append ce code dans global.aspx :
protected void Application_BeginRequest(object sender, EventArgs e) { HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*"); if (HttpContext.Current.Request.HttpMethod == "OPTIONS") { HttpContext.Current.Response.AddHeader("Cache-Control", "no-cache"); HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST"); HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept"); HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000"); HttpContext.Current.Response.End(); } }
Vous pouvez également créer les en-têtes requirejs dans un filtre.
@WebFilter(urlPatterns="/rest/*") public class AllowAccessFilter implements Filter { @Override public void doFilter(ServletRequest sRequest, ServletResponse sResponse, FilterChain chain) throws IOException, ServletException { System.out.println("in AllowAccessFilter.doFilter"); HttpServletRequest request = (HttpServletRequest)sRequest; HttpServletResponse response = (HttpServletResponse)sResponse; response.setHeader("Access-Control-Allow-Origin", "*"); response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT"); response.setHeader("Access-Control-Allow-Headers", "Content-Type"); chain.doFilter(request, response); } ... }