2009-10-16 6 views
5

Próbuję wykonać żądanie POST z różnych domen i uderzyłem o ścianę (lub dwie).Żądanie POST z synchronicznym krzyżowym subdomeną z jQuery

Nie mogę umieścić strony serwera proxy na serwerze - więc nie jest to opcja.

Sprawdziłem getJSON, który działa świetnie, z wyjątkiem tego, że muszę POST nie GET.

Czy można to zrobić? Jeśli jest to , nie, ktoś może mi wyjaśnić, jak działa getJSON i dlaczego nie mogę stworzyć alternatywnej metody POST.

Odpowiedz

26

CANNOT Państwo dokonać wielu domenach (GET/POST/itp) z XMLHttpRequest (alias AJAX).

Co można zrobić, gdy serwer go obsługuje, tworzy żądanie JSONP. Żądanie JSONP działa następująco:

  • jQuery tworzy dostępne globalnie funkcję z funkcją wywołania zwrotnego, które udostępniasz jako argument
  • Zamiast XMLHttpRequest (AJAX), aby uczynić żądanie HTTP, jQuery dynamicznie wstawia skrypt tag do DOM
  • SRC znacznika script jest żądanie URL, do którego próbują komunikować
  • jQuery dodaje param oddzwonienia do ciągu kwerendy tak: example.com/someurl.js?callback=someDynamicallyGeneratedMethodName
  • To jest w górze do serwera, aby powrócić JavaScript że klient może korzystać przekazując wynik JSON jako argument do someDynamicallyGeneratedMethodName

Jeśli nie masz kontroli nad serwerem, który Piszesz do, to jesteś pecha, JSONP wygrał nieźle ci idzie. Cokolwiek serwer zwróci, będzie znajdować się w tagu SCRIPT i najprawdopodobniej spowoduje błąd, jeśli nie jest poprawnie sformatowany.

Aby uzyskać więcej informacji na ten temat, sugeruję, abyś spojrzał na podstawową funkcję $ .ajax zamiast skrótów. (W dokumentacji jQuery pod Ajax. Niestety nie mogę dodać więcej linków)

Jeszcze raz, jeśli nie masz kontroli nad serwerem, do którego publikujesz, możesz zajrzeć do proxy, jeśli to możliwe. W przeciwnym razie IFRAME może być jedyną inną opcją. Istnieje również metoda wykonania tego przy pomocy obiektu SWF (flash). Próbowałem również, ale są one obejście ograniczeń obiektu XMLHttpRequest.

Mam nadzieję, że mogę pomóc!

+0

+1. Świetny post i witamy w SO! – aolde

+0

Dzięki za wyjaśnienie. Po tym jest dużo czystsze niż godzina Googling. Mam dostęp do serwera, na który publikuję, więc wszystko jest w porządku. –

+2

Dlaczego ten komentarz dotyczy tego tematu? Nie dotyczy POST, o które prosił specjalnie OT! – HRJ

2

Możesz pisać posty, ale to, czego potrzebujesz, to prośba JSONP, aby pozbyć się problemów związanych z domenami krzyżowymi. Zasadniczo udostępniasz funkcję oddzwaniania, a żądanie wraca jako treść skryptu, a wywołanie zwrotne jest wywoływane z danymi JSON z żądania. Twój skrypt po stronie serwera będzie musiał dostarczyć dane z powrotem jako wywołanie funkcji za pomocą funkcji zwrotnej owiniętej wokół obiektu JSON.

Zobacz dokumentację funkcji post.

$.post('/example.com/controller/action?callback=?', 
     { param: "data" }, 
     function(data) { 
      ...do something with the data... 
     }, 'jsonp'); 

ASP.NET MVC działania tego:

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Action(string param, string callback) 
{ 
    var jsonData = ...do something and construct some data in JSON... 

    return Content(callback + "(" + jsonData + ");"); 
} 
+1

Na przyszłość: wygląda na to, że Google Chrome 6.0.472.63 zbytnio tego nie lubi. W Safari przetwarza zwrócony JSON, ale Chrome pokazuje tylko "Null początkowy nie jest dozwolony przez Access-Control-Allow-Origin." wiadomość. – Cimm

0

Jeśli chcesz wykonać test POST z Cross Domain, najłatwiejszym rozwiązaniem jest dostarczony przez Matteo here. Udało mi się dobrze