2011-10-21 5 views
5

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?

Odpowiedz

2

Wydaje się, że jest to problem związany ze skryptem krzyżowym: adres URL może być problemem. Adres URL prawdopodobnie znajduje się na innym hoście niż skrypt, który wysyła żądanie. Przeglądarki nie zezwalają na to ze względów bezpieczeństwa.

+0

Następnie, jak zrobić to działając w domenie krzyżowej –

+0

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

Powiązane problemy