JSONP - działanie

0

Witam,
mam baaardzo ogólne pytanie: Czy jest ktoś w stanie objaśnić mi działanie mechanizmu JSONP (cross domain)? Przeglądam internet, przeglądam i nadal nie rozumiem. Konkretnie chodzi o wywołanie metody web serwisu. Aktualnie udaje mi się wywołać, jeśli web serwis jest na local host i zwracam dane jako JSON, natomiast chcę wywołać go z zupełnie innej domeny i jakoś mi ten JSONP nie chce działać. Dodam ze web serwice to WCF a wywołać go pragnę z JavaScriptu

1

Zwykły JSON to np: {foo: 'bar'}.
Ale ponieważ nie możesz odczytać danych z innej domeny - trzeba sobie radzić inaczej.

Zamiast wysyłać żądanie AJAX - po prostu doklejasz do dokumentu tag <script>, np:
<script src="http://domena.pl/api.js?callback=mojaFunkcja"></script>

Serwer w takim pliku zwraca JSON otoczony nazwą Twojej funkcji (ta z parametru callback), np: mojaFunkcja({foo: 'bar'})
W efekcie wykonuje się na Twojej stronie mojaFunkcja ze zwrotką w parametrze.

Tą metodą NIE DA SIĘ przesłać danych POST - ponieważ w tagu <script> jesteś ograniczony do GET.

0

OK, ale nadal nie wiem, w którym momencie mogę wywołać moją metodę po stronie web serwisu. Czy powinienem zrobić to w ciele funkcji "mojaFunkcja"?

Właściwie to do czego potrzebna mi jest nazwa callbacka i zwracane dane, skoro chcę tylko wywołać metodę web serwisu, który znajduje się poza moją domeną? Chyba nie bardzo rozumiem działanie tego całego mechanizmu... dodanie <script adres_web_serwisu(...)callback=mojaFunkcja" konczy się niepowodzeniem (unsafe port)

0

pokaż kod

0

W tej chwili nie mam dostępu do kodu, będę miał dopiero w poniedziałek, ale:
dla testowania wziąłem kod serwisu stąd :
http://www.bendewey.com/CodeBrowser/?zip=/code/JsonpWithWcfAndJquery.zip
do funkcji GetCustomers dorzuciłem pare linijek wykonujących pare rzeczy, ale to nieistotne.
Następnie do pustej strony html wrzuciłem wywołanie web serwisu w javascripcie. Tego kodu też nie mam, ale próbowałem dwoma sposobami:
$.getJSON('http://(moj_localhost)/CustomersService.svc/GetCustomers?callback=?', null, function (customers) {
alert('Received ' + customers.length + ' Customers');
});

oraz czymś w stylu:
$.ajax({
type: "GET",
url: "http://(moj_localhost)/CustomersService.svc/GetCustomers?callback=?",
dataType: "jsonp",
success: function (xml) {
alert("dziala");
},
});

W obu przypadkach działa, jeśli wywołuję to z localhost. Kiedy chcę wywołać ten sam web serwis wrzucony na serwer, wywala się błąd (unsafe port).

0

nie zadawaj pytań, jeżeli nie zamierzasz czytać odpowiedzi, przecież jasno napisałem:

Zamiast wysyłać żądanie AJAX - po prostu doklejasz do dokumentu tag <script>, np:

0

No właśnie napisałem wyżej, że dodanie tego tagu kończy się niepowodzeniem.

0

w którym miejscu to napisałeś i w którym miejscu w Twoim kodzie następuje jakiekolwiek doklejanie tagu script ? Ja nic takiego nie widzę

0
RP napisał(a):

OK, ale nadal nie wiem, w którym momencie mogę wywołać moją metodę po stronie web serwisu. Czy powinienem zrobić to w ciele funkcji "mojaFunkcja"?

Właściwie to do czego potrzebna mi jest nazwa callbacka i zwracane dane, skoro chcę tylko wywołać metodę web serwisu, który znajduje się poza moją domeną? Chyba nie bardzo rozumiem działanie tego całego mechanizmu... dodanie <script adres_web_serwisu(...)callback=mojaFunkcja" konczy się niepowodzeniem (unsafe port)

Tutaj napisalem. Fakt, mój błąd, nie przytoczylem tego w kodzie (jak mówilem nie mam w tej chwili do niego dostępu). Robię to mniej więcej tak:
<script src="http://192.168.(...):104/CustomersService.svc/GetCustomers?callback=?"></script>

Ciekawi mnie dlaczego już na wejściu przy dodaniu tego taga otrzymuję błąd. Jesteś pewien, że samo dodanie tego taga pozwoli na wywołanie metody web serwisu obcej domeny?

1

ech.

<button onclick="wyslijJSONP();">wyslij</button>
function wyslijJSONP() {
  var src = "http://ip.jsontest.com/?callback=zwrotkaJSONP"
  var script = document.createElement('script');
  script.src = src;
  document.body.appendChild(script);
}

function zwrotkaJSONP(zwrot) {
  alert(JSON.stringify(zwrot));
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1