Impossible d'effectuer un appel HTTP PUT / POST / DELETE à l'aide de CORS dans JQuery 1.6.4
Donc, je peux réussir à faire un appel à mon service à l'aide de la SCRO. Cependant, quelque chose de mal au niveau de contrôle en amont pour le POST, PUT et DELETE opérations. Cependant, de ce que je peux dire, l'en-tête des réponses de mon serveur est de retour en réponse aux OPTIONS de requête sont corrects et correspondent à celles décrites dans
Voici mon code javascript, en utilisant $.ajax en JQuery 1.6.4.
$.ajax({
url: 'http://myhome:8080/TaskApproval/resources/tasks/2',
context: this,
data: '<?xml version="1.0" encoding="UTF-8"?> <task> <description>Get carrots from the grocery store</description><originator>Chris</originator><subject>Get Carrots !!</subject><taskId>2</taskId> </task> ',
timeout: 30000,
type: 'PUT',
contentType: 'application/xml',
success: function(response) {
alert(response);
result = response;
},
error: function(xhr) {
alert('Error! Status = ' + xhr.status + " Message = " + xhr.statusText);
}
});
Maintenant, c'est ce que mon HTTP Sentier ressemble, avec l'aimable autorisation de Firebug.
Demande:
OPTIONS /TaskApproval/resources/tasks/2 HTTP/1.1
Host: widgethome:8080
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:6.0.2) Gecko/20100101 Firefox/6.0.2
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip, deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Connection: keep-alive
Origin: http://localhost:8080
Access-Control-Request-Method: PUT
Access-Control-Request-Headers: content-type
Réponse:
HTTP/1.1 200 OK
X-Powered-By: Servlet/3.0
Server: GlassFish v3
Allow: OPTIONS,GET,DELETE,HEAD,PUT, POST
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: POST, GET, OPTIONS, PUT, DELETE
Access-Control-Max-Age: 1000
Access-Control-Allow-Headers: *
Content-Type: application/xml
Content-Length: 2792
Date: Wed, 28 Sep 2011 18:21:11 GMT
Il n'y a alors pas de METTRE (ou de publier ou SUPPRIMER), je viens d'obtenir que gênant non utiles xhr objet qui ressemble à ceci:
readyState 0
responseText ""
status 0
statusText "error"
Je suis très perplexe devant si je puis retirez le contentType dans mon appel Ajax, et il envoie une défaillance de type de contenu par mon application, le navigateur envoie ma demande PUT, qui échoue en raison du Type de Contenu qui n'est pas d'application/xml. Voir ci-dessous:
$.ajax({
url: 'http://myhome:8080/TaskApproval/resources/tasks/2',
data: '<?xml version="1.0" encoding="UTF-8"?> <task> <description>Get carrots from the grocery store</description><originator>Chris</originator><subject>Get Carrots !!</subject><taskId>2</taskId> </task> ',
timeout: 30000,
type: 'PUT',
//contentType: 'application/xml',
success: function(response) {
alert(response);
result = response;
},
error: function(xhr) {
alert('Error! Status = ' + xhr.status + " Message = " + xhr.statusText);
}
});
Conduit à cette HTTP Sentier, de nouveau courtoisie de Firebug:
Demande Options:
OPTIONS /TaskApproval/resources/tasks/2 HTTP/1.1
Host: myhome:8080
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:6.0.2) Gecko/20100101 Firefox/6.0.2
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip, deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Connection: keep-alive
Origin: http://localhost:8080
Access-Control-Request-Method: PUT
Options De Réponse:
HTTP/1.1 200 OK
X-Powered-By: Servlet/3.0
Server: GlassFish v3
Allow: OPTIONS,GET,DELETE,HEAD,PUT, POST
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: POST, GET, OPTIONS, PUT, DELETE
Access-Control-Max-Age: 1000
Access-Control-Allow-Headers: *
Content-Type: application/xml
Content-Length: 2792
Date: Wed, 28 Sep 2011 18:26:23 GMT
Mettre De La Demande:
PUT /TaskApproval/resources/tasks/2 HTTP/1.1
Host: myhome:8080
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:6.0.2) Gecko/20100101 Firefox/6.0.2
Accept: */*
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip, deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Referer: http://localhost:8080/TaskApproval/crossdomain.html
Content-Length: 197
Origin: http://localhost:8080
Mettre Réponse:
HTTP/1.1 415 Unsupported Media Type
X-Powered-By: Servlet/3.0
Server: GlassFish v3
Content-Type: text/html
Content-Length: 1069
Date: Wed, 28 Sep 2011 18:26:23 GMT
L'415 du sens parce que je ne supporte pas de contenu application/x-www-form-urlencoded, seule application/xml. Ce que je ne comprends pas, c'est pourquoi le réglage du Type de Contenu correctement empêcher de la METTRE?
Merci pour toute perspicacité! J'ai été à la recherche de l'internet pour un certain temps, et ne peut pas trouver une solution à ce problème.
source d'informationauteur ChrisBean
Vous devez vous connecter pour publier un commentaire.
Vous devez inclure les en-têtes de la SCRO à la fois le contrôle et la réponse réelle. Essayez donc y compris les en-têtes suivants dans les MIS de réponse de votre serveur:
Une autre chose à noter est que la SCRO spécification ne fait pas la liste des '*' comme une valeur valide pour Access-Control-Allow-en-Têtes:
http://www.w3.org/TR/cors/#access-control-allow-headers-response-he
Au lieu de cela, vous devriez essayer explicitement liste de tous les en-têtes de requête comme ceci:
Vous devez inclure le Type de Contenu parce que le Type de Contenu n'est pas considéré comme un simple en-tête lorsque sa valeur n'est pas d'application/x-www-form-urlencoded, multipart/form-data, ou text/plain (Voir la SCRO spec pour plus de détails sur les en-têtes simples).
N'oubliez pas de assurez-vous que votre prefight Options demande également répondu avec:
À L'Aide De Chrome Extension
De faire
CORS
demande, vous pouvez utiliser ce simple extension chrome (de Permettre le contrôle Permettre d'origine).Cela vous permettra de faire
CORS
demande sans ajouter un paramètre supplémentaire dansheaders/config
.