[jquery,ajax] pobieranie danych z innej domeny

0

Jak to jest z pobieraniem danych z innych domen w ajaxie? Czy można tylko z tej w której obecnie znajduje się skrypt? Czy są jakieś wyjątki. Co jeśli skrypt uruchamiany jest lokalnie? Poza tym jquery posiada kilka ajaxowych funkcji jak:
jQuery.get()
jQuery.getJSON()
jQuery.getScript()
jQuery.post()
jQuery.ajax()

Czy to wszystko są różne opakowania tej samej funkcji window.XMLHttpRequest ?
(http://api.jquery.com/category/ajax/)

Chciałem pobrać plik JASONa z jakiejs domeny za pomocą skryptu lokalnego, ale nie działało. Skorzystałem więc z tego hacka, który powoduje, że jason pobierany jest przez serwer proxy yahoo:

 $(document).ready(function(){
var container = $('#target');
$('.ajaxtrigger').click(function(){
doAjax($(this).attr('href'));
return false;
});
function doAjax(url){
// if it is an external URI
if(url.match('^http')){
// call YQL
$.getJSON("http://query.yahooapis.com/v1/public/yql?"+
"q=select%20*%20from%20html%20where%20url%3D%22"+
encodeURIComponent(url)+
"%22&format=xml'&callback=?",
// this function gets the data from the successful
// JSON-P call
function(data){
// if there is data, filter it and render it out
if(data.results[0]){
var data = filterData(data.results[0]);
container.html(data);
// otherwise tell the world that something went wrong
} else {
var errormsg = '<p>Error: could not load the page.</p>';
container.html(errormsg);
}
}
);
// if it is not an external URI, use Ajax load()
} else {
$('#target').load(url);
}
}
// filter out some nasties
function filterData(data){
data = data.replace(/<?/body[^>]*>/g,'');
data = data.replace(/[r|n]+/g,'');
data = data.replace(/<--[Ss]*?-->/g,'');
data = data.replace(/<noscript[^>]*>[Ss]*?</noscript>/g,'');
data = data.replace(/<script[^>]*>[Ss]*?</script>/g,'');
data = data.replace(/<script.*/>/,'');
return data;
}
});

http://www.wait-till-i.com/2010/01/10/loading-external-content-with-ajax-using-jquery-and-yql/

tylko nie rozumiem jak to działa. Dlaczego dane z yahoo są pobierane a bezpośrednio z mojej strony nie?

1

ajaks (tj. XMLHttpRequest) nie daje możliwości zaciągnięcia danych z innego serwera, niż ten na którym znajduje się strona (strona - nie skrypt!). załadowanie danych z innej domeny jest możliwe poprzez np. iframe, ale do samych danych nie można się dostać ze skryptu pracującego w sandboksie innej domeny. da się to zrobić w inny sposób (XSS): przez proxy na serwerze lub - jeśli obcy serwer zezwala na takie rzeczy w crossdomain.xml - przez proxy we flashu lub silverlight.

dziwi mnie, że przez yahoo zapytanie idzie, bo yahoo też podlega temu, co napisałem; jednak moja wiedza nt. jquery jest na tyle wątła, że na zdziwieniu się pozostanę.

0

sam pogooglałem aby dojść i wygląda, że tak:

Po pierwsze z tego co czytam (bo nie testowałem) to nie prawdą jest, że AJAX a właściwie window.XMLHttpRequest pozwala na pobieranie danych z innych domen niz strony, a trick stąd
http://www.wait-till-i.com/2010/01/10/loading-external-content-with-ajax-using-jquery-and-yql/
dokładniej opisany tu:
http://insideria.com/2009/03/what-in-the-heck-is-jsonp-and.html
co ma powiązanie z: http://api.jquery.com/jQuery.getJSON/
a szczegółowo tu: http://bob.pythonmac.org/archives/2005/12/05/remote-json-jsonp/
co oznacza, że aby pobrać przez to proxy yahoo dane z innych serwerów niż ten skryptu, link do proxy jest za pomocą /jQuery.getJSON z parametrem "callback=?" wklejany do headera html jako nowy skrypt includowany z tego serwera (parametr callback powoduje inne działanie metody getJSON od domyślnej, która polega na wywołaniu XMLHttpRequest)
ten skrypt jest przez html interpretowany, a serwer yahoo wypełnia go danymi pobranymi (bo to proxy) ale tez uruchamia wskazana przez parametr funkcje przez co jest powiadomienie kiedy dane się pobrały

tu jest, że za pomocą XMLHttpRequest nie da się z innych domen http://www.w3.org/TR/XMLHttpRequest/#same-origin-request-event-rules

1

Nie zgodzę się z poprzednikami. Istnieją sposoby na to, aby ajax [także ten oparty w 100% na XMLHttpRequest] odczytywał dane z innej domeny [tu chodzi o tomenę, nie serwer. Serwer fizycznie może być inny, choć zakładam, że to był skrót myślowy].

Zapraszam do lektury (kilka sposóbów):
http://www.yarpo.pl/2011/05/06/odczytywanie-danych-ze-zdalnego-serwera/

0

Bardzo proszę o nie mylenie technologii AJAX z JSONP, dziękuję :)

Właśnie JSONP jest używany (najczęściej) jako dynamiczne API dla innych domen. To, że jest to dynamiczne nie oznacza, że jest to zapytanie AJAXowe.
Przykład takiego API: Flickr.

0
  1. Skłaniałbym się raczej do tego, że Ajax to nie technologia, a technika wykorzystująca istniejące technologie. Dodatkowo raczej Ajax, a nie AJAX, bo dzisiaj najczęściej używa się JSONa, więc skąd owy X?:) [ AJAJ?:)]

  2. W linkowanych przeze mnie artykułach jest też mowa o odpowiednim nagłowku po stronie serwera:
    http://www.yarpo.pl/2011/05/06/ajax-z-access-control-allow-origin/ więc można odczytywać Ajaksem [w określonych warunkach] z obcej domeny.

Pozdrawiam :)

0

No tak, w firmie nawet czasem mówimy AJAJ, a nie AJAX. Zgadzam się, obecnie AJAX (upieram się przy wielkich literach jako pisowni akronimu) jest używany jako nazwa ogólna dla dynamicznych zapytań opartych o XMLHttpRequest - a czy to zwróci XMLa, JSONa czy inny format to już mało istotne.

Co do 2) - nawet jeśli jest to wspierane, to nie wydaje mi się dobrym pomysłem. Jeśli chcemy udostępnić stronom trzecim dostęp do API, to jawny JSONP wydaje się lepszym pomysłem. 100% wsparcia i jawności. A nagłówek jest mocno niejawny i z pozoru kod wydaje się błędny, trzeba dodawać dokumentację, że akurat dla tego serwera można stosować klasyczny XMLHttpRequest. Mgliste. Ale jest to jakaś alternatywa.

0

Komentarza nikt nie zobaczy więc napiszę jeszcze raz:
Wystarczy dodać do nagłówków
Access-Control-Allow-Origin:*
by zezwolić innym witrynom na dynamiczne pobieranie treści.

Zobaczcie sami:
http://query.yahooapis.com/v1/public/yql?q=use%20'http%3A%2F%2Fyqlblog.net%2Fsamples%2Fdata.html.cssselect.xml'%20as%20data.html.cssselect%3B%20select%20*%20from%20data.html.cssselect%20where%20url%3D%22www.bordeux.net%2FSoftware%2F%22%20and%20css%3D%22%23TitleDiv%20*%22&format=json&diagnostics=true&callback=cbfunc

Wystarczy nagłówki odczytać, jakie dostajemy w odpowiedzi.

Access-Control-Allow-Origin:*
Age:2
Cache-Control:public, max-age=299
Connection:keep-alive
Content-Encoding:gzip
Content-Type:text/javascript;charset=utf-8
Date:Sat, 28 May 2011 17:13:03 GMT
Server:YTS/1.19.8
Transfer-Encoding:chunked
Vary:Accept-Encoding

Dokumentacja -
https://developer.mozilla.org/en/HTTP_access_control - dla xmla , to już jak widzę było omawiane
http://ejohn.org/blog/cross-site-xmlhttprequest/ <- jakiś blog o cross domain XHR
https://wiki.mozilla.org/Cross_Site_XMLHttpRequest -> wstęp do dokumentacji XHR cross domain

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