Zanim powiesz, że jest inny post (jQuery $.ajax(), $.post sending "OPTIONS" as REQUEST_METHOD in Firefox), tak, to doens't pomóc w ogóle, więc ..metoda Zapytanie jest OPCJE zamiast pocztą (istniejący Stack Exchange Network po doens't pomóc)
używam Chrome dev najnowsza wersja i gdy próbuję wysłać plik do API zdalnego Video Converter dla usługi jak ta, to działa (wszystko jest w coffeescript) Nazwijmy ten kod 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
powyższe zwraca 200 i po prostu działa . Ale mam jQuery na stronie, więc pomyślałem, że go użyję, więc mam wersję jQuery powyższego w ten sposób. I nazwijmy ten kod 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'
uzyskać to 400 (Bad Request), mówiąc Pochodzenie http://127.0.0.1:3000
nie jest dozwolone przez Access-Control-Allow-Origin.
Ale zdobądź to, jeśli odkomentuję kod 1 i skomentuję kod 2, odśwież stronę i prześlij plik, który się powiedzie, i wykasuj kod 1 i kod komentarza 2 i odśwież stronę i prześlij plik, TERAZ - kod 2 nie wyrzuci tego błędu 400 nieprawidłowych żądań !!
Ale jeśli zamknę całą przeglądarkę i załaduję stronę, która używa kodu 2, przesłanie pliku spowoduje błąd 400 niezależnie od tego, ile razy próbuję. Jeśli zrobię to, co opisuje poprzedni akapit, kod 2 zadziała!
I jeszcze jedno, dziennik Network w konsoli Chrome mówi, że żądania, które wykonuję za pomocą kodu 2, mają "OPTIONS" jako metodę żądania. Podczas gdy w kodzie 1, metoda żądania jest "POST"
Czy ktoś wie, co się tutaj dzieje?
Następnie, jak zrobić to działając w domenie krzyżowej –
Przy normalnym XHR nie jest to możliwe. Można jednak zrobić kilka hacków takich jak ładowanie danych json w znaczniku skryptu (dołączanie go do nagłówka) i wywoływanie funkcji [JSONP] (http://en.wikipedia.org/wiki/JSONP). – Timo