2011-10-21 10 views
5

Antes de decir que hay otro post (jQuery $.ajax(), $.post sending "OPTIONS" as REQUEST_METHOD in Firefox), sí, doens't ayuda en absoluto, por lo ..Método de petición es OPCIONES vez del poste (existente después StackExchange ayuda doens't)

estoy usando Chrome dev última versión y cuando trato de enviar un archivo a la API de un convertidor de vídeo de servicio remoto como este, funciona (todo está en CoffeeScript) Vamos a llamar a este código 1:

json_string = getNewSignedParams() 

    xhr = new XMLHttpRequest 
    xhr.open('POST', some_url, true) 
    xhr.setRequestHeader("Cache-Control", "no-cache") 
    xhr.setRequestHeader("Content-Type", "application/octet-stream") 
    xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest") 
    xhr.setRequestHeader("X-File-Name", some_file.name || some_file.fileName) 
    xhr.setRequestHeader("X-Query-Params", json_string) 

    xhr.send some_file 

Los rendimientos por encima de un 200 y simplemente funciona . Pero tengo jQuery en la página, así que pensé que lo usaría, así que tengo una versión jQuery de lo anterior como esta. Y vamos a llamar a este código 2:

$.ajax 
    url: some_url 
    type: 'post' 
    data: some_file 
    processData: false 
    beforeSend: (xhr) -> 
     xhr.setRequestHeader("Cache-Control", "no-cache") 
     xhr.setRequestHeader("Content-Type", "application/octet-stream") 
     xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest") 
     xhr.setRequestHeader("X-File-Name", some_file.name || some_file.fileName) 
     xhr.setRequestHeader("X-Query-Params", json_string) 
    success: -> 
     console.log 'success' 

me sale este 400 (Bad Request), diciendo Origen http://127.0.0.1:3000 no está permitido por Access-Control-Allow-Origin.

Pero consiga esto, si descomenta el código 1 y comenta el código 2 y actualiza la página y carga un archivo, que será exitoso, comente el código 1 y elimine el código 2, actualice la página y suba un archivo, ¡AHORA el código 2 no arrojará ese error de solicitud 400 Bad!

Pero si cierro el navegador completo y cargo la página que está usando el código 2, la carga de un archivo me generará el error 400 sin importar cuántas veces lo intente. ¡Entonces, si hago lo que describe el párrafo anterior, el código 2 funcionará!

Y una cosa más, el registro de red en la consola de Chrome dice que las solicitudes que hago con el código 2 tienen "OPCIONES" como el método de solicitud. Mientras que en el código 1, el método de solicitud es "POST"

¿Alguien sabe qué está pasando aquí?

Respuesta

2

Esto parece ser un problema de scripts entre sitios: la url podría ser el problema en realidad. La url probablemente se encuentre en un host diferente al script que realiza la solicitud. Los navegadores no permiten eso por razones de seguridad.

+0

Entonces, cómo hacer que esto se ejecute en dominio cruzado –

+0

Con un XHR normal, esto no es posible. Sin embargo, podrías hacer algunos hacks como cargar tus datos json en una etiqueta de script (anexarla a la cabecera) y llamar a una función [JSONP] (http://en.wikipedia.org/wiki/JSONP). – Timo

Cuestiones relacionadas