En mi aplicación, recibo un error de verificación previa en la segunda llamada AJAX cuando realizo la siguiente llamada de dos pasos:
$.ajax({ type:'POST', url:'https://podio.com/oauth/token', data: { 'grant_type': 'app', 'app_id': '#####', 'app_token': '#####', 'client_id': '#####', 'redirect_uri': '#####', 'client_secret': '#####' } }).done(function(response){ $.ajax({ type:'PUT', contentType: "application/json", headers: {'Authorization': 'OAuth2 ' + response.access_token}, url:'https://api.podio.com/item/1/value/142784383', data: JSON.stringify({"values": "doofus@test.com"}) }).done(function(response){ console.log(response) }).fail(function(error){ console.log(error) }) })El error en Chrome (con la extensión de navegador CORS Toggle activada) es el siguiente:
jquery.min.js:4 OPCIONES https://api.podio.com/item/1 400 () test.html:1 XMLHttpRequest no puede cargar https://api.podio.com/item/1/value/142784383 . La respuesta para la verificación previa tiene un código de estado HTTP 400 no válido
y registros de Safari
Failed to load resource: the server responded with a status of 403 (HTTP/2.0 403) refiriéndose a https://api.podio.com/item/1/value/142784383
Aunque he usado llamadas AJAX como esta muchas veces para mis propias aplicaciones, no estoy familiarizado con algunos de los matices de interactuar con API externas. Cualquier idea sobre las causas y soluciones a este problema sería muy apreciada.
Veo que define el tipo de contenido como application/json. Lo que pasa es que cuando el tipo de contenido es diferente al simple texto/html (y un par de otros), el navegador envía una solicitud de OPCIONES para asegurarse de que el servidor espera el tipo de contenido.
Luego, el servidor tiene que enviar un par de encabezados. Es posible que esté familiarizado con access-control-allow-origin: * pero el servidor también necesita decirle al navegador qué campos de encabezado está dispuesto a aceptar. Para eso, el servidor necesita enviar un
Access-Control-Request-Headers: Content-TypeEsto le dice al navegador que el cliente puede enviar un encabezado de tipo de contenido en la solicitud real. Por lo tanto, debe asegurarse de que el servidor no solo acepte y devuelva 200 en una solicitud de OPCIONES, sino que también envíe los dos encabezados mencionados anteriormente.
En respuesta a su comentario, no necesita hacer nada en el cliente. El servidor necesita enviar esos encabezados.