2010-08-27 33 views
5

Nie mogę pomyślnie opublikować przy użyciu funkcji ajax jquery.jQuery Ajax POST nieudany

Adres URL bieżącej strony to http://localhost:9999, adres URL celu (usługi internetowej) to http://localhost:8080. Żadne porty nie są takie same, są to odpowiednio 9999 i 8080.

Poniżej znajduje się kod żądania i jquery ajax.

Zapytanie:

OPTIONS /profile/set_member HTTP/1.1 
Host: localhost:8080 
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: en-us,en;q=0.5 
Accept-Encoding: gzip,deflate 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 
Keep-Alive: 115 
Connection: keep-alive 
Origin: http://localhost:9999 
Access-Control-Request-Method: POST 

kod jQuery ajax:

$.ajax({ 
     type: "POST", url: "http://localhost:8080/profile/set_member", 
     contentType: "application/json", data: member, 
     error: function(){ alert('Update failed!'); }, 
     processData: false, 
     success: function(){ alert('Update successful!'); } 
}); 
+0

Czy piszesz z tej samej domeny? – BrunoLM

+0

Jaki jest adres URL uruchomionej strony? –

+0

A z tego samego portu? –

Odpowiedz

6

Jest to problem związany z wywoływaniem ajaxów w wielu domenach. Zasadniczo (przynajmniej w Firefoksie) żądanie POST jest konwertowane na żądanie OPTIONS ze względów bezpieczeństwa. Wpadłem wczoraj wieczorem na tę samą, , dokładnie, tutaj.

WCF Ajax Call not working with Jquery $.ajax

miałem $ .ajax wywołania robiłem na localhost: 23485, do usługi internetowej o http://localhost obsługiwanej w IIS. Ponieważ są to różne domeny, wykroczenie między domenami utrudniło pracę.

+0

Bardziej irytującym symptomem jest to, że wywołanie $ .ajax często oznacza sukces, gdy wywołuje ten szczególny rodzaj połączenia, nawet jeśli nie zadziałało. – Dusda

+0

Ponadto, patrząc na Twój nagłówek żądania, widzę, że adresy Origin i Host są zarówno localhost, ale z różnych portów. Dokładnie to samo, co wpadł ostatniej nocy :(. – Dusda

+0

@Dusda: Masz rację, to jest ten sam problem.Na pozór "jedynym" rozwiązaniem jest posiadanie proxy między wywołaniem ajax a serwisem WWW. – Mads610

0

Co obsługi jest wywoływana? Obsługa success lub error? Czy możesz wyjaśnić, co oznacza "nie działa"?

Prawdopodobnie chcesz alert więcej informacji w swojej obsługi error, tak:

error: function(XMLHttpRequest, textStatus, errorThrown) { 
    //console.log is better at least for debugging. You can change this back to alert 
    //when your code goes into production 
    console.log("Update unsuccessful. Status: ", textStatus, " error thrown: ", errorThrown); 
} 

textStatus powinny dać wyobrażenie, co może być problemem. Możliwe wartości to "timeout", "error", "notmodified" i "parsererror". Po ustaleniu rzeczywistego błędu zaktualizuj pytanie.

Również jeśli masz Firebuga, sprawdź zakładkę Netto, aby zobaczyć prośbę i odpowiedź. Kilka typowych źródeł błędów:

  • Naruszenie zasad dotyczących pochodzenia. Nie można przekształcić AJAX w inny adres URL niż strona nadrzędna.
  • Błędy po stronie serwera. Jeśli serwer zwróci coś w rodzaju kodu odpowiedzi 500, żądanie zakończy się niepowodzeniem.
  • Parsowanie błędów. Jeśli oczekujesz określonego formatu odpowiedzi, na przykład json lub xml, a jeśli odpowiedź nie jest w tym formacie, żądanie AJAX zakończy się niepowodzeniem.
4

Utwórz serwer proxy w tej samej domenie, którą wywołujesz ajax, np. w PHP:

<?php /* get.php */ 
    $url = $_GET["Url"]; 
    echo file_get_contents($url); 
?> 

Wykonaj połączenie ajax:

$.ajax({ url: "get.php?Url=realurl.com" }); 

To jedno obejście.