it-swarm.com.de

Wie erhalte ich Daten mit JavaScript von einem anderen Server?

Wie kann ich mit einem JavaScript im Browser des Benutzers Anfragen an andere Server stellen (d. H. Eine Seite von einem beliebigen Server abrufen)? Es gibt Einschränkungen, um dies für Methoden wie XMLHttpRequest zu verhindern. Gibt es Möglichkeiten, diese oder andere Methoden zu umgehen?

Dies ist eine allgemeine Frage, insbesondere möchte ich eine Reihe von zufälligen Websites überprüfen und feststellen, ob sie ein bestimmtes Element enthalten. Daher benötige ich den HTML-Inhalt einer Website, ohne zusätzliche Dateien herunterzuladen. all das in einer JavaScript-Datei, ohne Weiterleitung oder Proxy-Mechanismus auf einem Server .

(Hinweis: Eine Möglichkeit ist die Verwendung von Greasemonkey und dessen GM_xmlhttpRequest.)

17
user46665

Sie sollten jQuery auschecken. Es hat eine reichhaltige Basis an AJAX Funktionalität , die Ihnen die Möglichkeit gibt, all dies zu tun. Sie können eine externe Seite laden und den HTML-Inhalt mit intuitiven CSS-ähnlichen Selektoren analysieren.

Ein Beispiel mit $ .get ();

$.get("anotherPage.html", {}, function(results){
  alert(results); // will show the HTML from anotherPage.html
  alert($(results).find("div.scores").html()); // show "scores" div in results
});

Für externe Domains musste ich ein lokales PHP-Skript erstellen, das als Mittelmann fungiert. jQuery ruft das lokale Skript PHP auf und übergibt die URL eines anderen Servers als Argument, das lokale Skript PHP sammelt die Daten und jQuery liest die Daten aus dem lokalen PHP script.

$.get("middleman.php", {"site":"http://www.google.com"}, function(results){
  alert(results); // middleman gives Google's HTML to jQuery
});

Middleman.php etwas im Sinne von geben 

<?php

  // Do not use as-is, this is only an example.
  // $_GET["site"] set by jQuery as "http://www.google.com"
  print file_get_contents($_GET["site"]);

?>
21
Sampson

Schreiben Sie ein Proxy-Skript, das die http-Anforderung von Ihrer Domäne weiterleitet. Dabei werden die Einschränkungen von XMLHttpRequest umgangen.

Wenn Sie PHP verwenden, verwenden Sie einfach cURL, um die Seite anzufordern und zu lesen. Spucken Sie dann einfach die HTML aus, als ob sie von Ihrer Domain wäre.

3
mmattax

Das ist ziemlich einfach ... wenn Sie den "geheimen" Trick kennen, den fast niemand teilt ..

Es heißt Yahoo yql ...

Um also wieder die Macht für den Benutzer zu erlangen (und zum bequemen Mantra zurückzukehren: "Akzeptieren Sie niemals Nein"), verwenden Sie einfach http://query.yahooapis.com/ (anstelle eines PHP-Proxy-Servers) Skript).
jQuery wäre nicht unbedingt erforderlich.

BEISPIEL 1:
Verwenden des SQL-ähnlichen Befehls: 

select * from html 
where url="http://stackoverflow.com" 
and xpath='//div/h3/a'

Der folgende Link wird SO für die neuesten Fragen (unter Umgehung des domänenübergreifenden Sicherheitsbullens $ #! 7) abfragen:
http://query.yahooapis.com/v1/public/yql?q=select%20title%20von%20html%20where%20url%3D%22http%3A%2Fstackoverflow.com%22 % 20und% 0A% 20% 20% 20% 20% 20xpath% 3D% 27% 2F% 2Fdiv% 2Fh3% 2Fa% 27% 0A% 20% 20% 20% 20 & format = json & callback = cbfunc

Wie Sie sehen, wird ein JSON-Array zurückgegeben (man kann auch xml wählen) und die Callback-Funktion aufrufen: cbfunc.

Als "Bonus" können Sie auch ein Kätzchen speichern jedes Mal, wenn Sie keine Daten aus "Tag-Suppe" ausfüllen müssen. 

Hörst du, wie dein kleiner verrückter Wissenschaftler in dir zu kichern anfängt? 

Dann sehen Sie diese Antwort für weitere Informationen (und vergessen Sie nicht, dass es Kommentare für weitere Beispiele gibt).

Viel Glück!

3
GitaarLAB

update 2018:

Sie können domänenübergreifend nur mit den folgenden 4 Bedingungen zugreifen

  • als Antwortkopf hat Access-Control-Allow-Origin: *

Demo

$.ajax({
  url: 'https://api.myjson.com/bins/bq6eu',
  success: function(response){
    console.log(response.string);
  },
  error: function(response){
    console.log('server error');
  }
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

  • server als Bridge oder Proxy zum Ziel verwenden

Demo:

$.ajax({
  url: 'https://cors-anywhere.herokuapp.com/http://whatismyip.akamai.com/',
  success: function(response){
    console.log('server IP: ' + response);
  },
  error: function(response){
    console.log('bridge server error');
  }
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

  • verwenden des Browser-Addons zum Aktivieren von Allow-Control-Allow-Origin: *
  • deaktivieren Sie die Web-Sicherheit Ihres Browsers

Chrom

chrome.exe --args --disable-web-security

Feuerfuchs

about:config -> security.fileuri.strict_Origin_policy -> false

ende


noob alte antwort 2011

$ .get (); Daten können von jsbin.com abgerufen werden, aber ich weiß nicht, warum sie keine Daten von einer anderen Website wie google.com erhalten können

$.get('http://jsbin.com/ufotu5', {},
  function(results){  alert(results); 
});

demo: http://jsfiddle.net/Xj234/ getestet mit Firefox, Chrom und Safari.

1
ewwink

<script language = "JavaScript" type = "text/javascript" src = "http://www.example.com/hello.js"> </ script>

Sie fügen die Daten in hello.js als Array, JSON oder ähnliches ein. Beispiel: Var daysInMonth = new Array (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);

Ein JavaScript von einem anderen Server zu bekommen ist nicht viel einfacher .. :-)

0

Sie müssen dazu einen Proxy auf dem Server schreiben. Alle Anfragen werden an Ihren Server gesendet. Anschließend lädt Ihr Server die HTML-Datei und sendet sie an den Client zurück. Und es gibt keine gute Möglichkeit, dies nur über Javascript zu implementieren.
jQuery enthält Funktionen zum Laden von JSON-Daten oder externen Skripts mit XmlHttpRequest. Diese Funktion kann jedoch nicht für HTML-Seiten verwendet werden. Sie können auch diesen Thread der jQuery-Mailingliste überprüfen.

0
zihotki

Vielen Dank, das ist wirklich ein guter Trick. Ich habe es so gemacht:

test.html

<!DOCTYPE html>
<html>
<head>
<script>
function loadXMLDoc()
{
if (window.XMLHttpRequest)
  {// code for IE7+, Firefox, Chrome, Opera, Safari
  xmlhttp=new XMLHttpRequest();
  }
else
  {// code for IE6, IE5
  xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  }
xmlhttp.onreadystatechange=function()
  {
  if (xmlhttp.readyState==4 && xmlhttp.status==200)
    {
    document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
    }
  }
xmlhttp.open("GET","sp.php",true);
xmlhttp.send();
}
</script>
</head>
<body>

<h2>Using the XMLHttpRequest object</h2>
<div id="myDiv"></div>
<button type="button" onclick="loadXMLDoc()">Change Content</button>

</body>
</html>

sp.php

<?php
  print file_get_contents("http://your.url.com/you-can-use-cross-domain");
?>
0
GniK KinG

Sie können auch einen iframe verwenden, um eine Ajax-Anforderung zu emulieren. Dies erspart Ihnen das Chaos, eine Backend-Lösung für ein Frontend-Problem programmieren zu müssen. Hier ist ein Beispiel:

function setUploadEvent(typeComponet){
       var eventType = "";
       var iframe = document.getElementById("iframeId");
       try{
           /* for Mozilla / Opera9 */
           if (/(?!.*?compatible|.*?webkit)^mozilla|opera/i.test(navigator.userAgent)) {
                eventType = "onload";
           }else{
           /* IE  */
                eventType = "onreadystatechange";
           }

           iframe[eventType] = function(){
                var doc = iframe.contentDocument || iframe.contentWindow.document;
                var response = doc.body.innerHTML; /* or what ever content you are looking for */
             }
           }
       catch(e){
           alert("Error loading content")}
       } 

Das sollte den Trick tun. Bitte beachten Sie, dass die Browser-Erkennungslinie nicht die sauberste ist. Sie sollten unbedingt die in allen gängigen JS-Frameworks (Prototype, JQuery usw.) bereitgestellte verwenden.

0
Chepech