Tengo creada una API Rest a la que trato de acceder desde otro dominio mediante Ajax.
Para hacer el crossdomain hago uso de la tecnica Cross Domain Resource Sharing (CORS).
Código Javascript:
Ver original
var createCORSRequest = function(method, url){ var xhr = new XMLHttpRequest(); if ("withCredentials" in xhr){ xhr.open(method, url, true); } else if (typeof XDomainRequest != "undefined"){ xhr = new XDomainRequest(); xhr.open(method, url); } else { xhr = null; } return xhr; } var performAsyncCall = function(url, method, data, callback) { var request = createCORSRequest(method, url); if (request) { request.onload = function(){ if (request.readyState == 4 ) { if(request.status == 200){ callback(request.responseText); } else if(request.status == 400) { console.error('Error 400') } else { console.error('Error when calling performing remote call: ' + request.status) } } }; request.send(data); } }
Cuando accedo a recursos mediante GET no tengo problema alguno.
Sin embargo, ahora intento hacer un PUT (open("PUT", url)) para realizar una modificacion y en este caso siempre me esta devolviendo un error:
Cita:
Las cabeceras de la request generadas parecen correctas:XMLHttpRequest cannot load http://miDominio/nomApp/update/p/34000. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://otroDominio' is therefore not allowed access.
Origin:http://otroDominio
Access-Control-Request-Headers:content-type
Access-Control-Request-Method:PUT
Sin embargo al hacer la peticion, veo en el navegador que la realiza enviando un request-method OPTIONS, en lugar de PUT
Remote Address:192.168.216.43:80
Request URL:http://miDomibnio/miApp/update/p/34000
Request Method:OPTIONS
Status Code:200 OK
Y las Response Headers:
Allow:OPTIONS, PUT
Connection:Keep-Alive
Content-Length:0
Content-Type:text/plain
Date:Fri, 15 May 2015 12:30:02 GMT
Keep-Alive:timeout=5, max=100
Server:Apache/2.2.12 (Win32) DAV/2 mod_ssl/2.2.12 OpenSSL/0.9.8k mod_autoindex_color mod_jk/1.2.28
Es como si cambiase el metodo PUT por OPTIONS.
He probado con GET y con POST y funciona sin problemas. Para poder continuar he tenido que cambiar el recurso rest para que responda por POST , pero me da rabia ya que se trata de una modificacion y me gustaria hacerlo por rest estricto.
A alguien se le ocurre que puedo estar haciendo mal?
Muchas gracias