Żądanie HTTP GET w JavaScript?


Odpowiedzi:


1206

Przeglądarki (i Dashcode) udostępniają obiekt XMLHttpRequest, którego można używać do wysyłania żądań HTTP z JavaScript:

function httpGet(theUrl)
{
    var xmlHttp = new XMLHttpRequest();
    xmlHttp.open( "GET", theUrl, false ); // false for synchronous request
    xmlHttp.send( null );
    return xmlHttp.responseText;
}

Jednak żądania synchroniczne są odradzane i generują ostrzeżenie w następujący sposób:

Uwaga: Począwszy od Gecko 30.0 (Firefox 30.0 / Thunderbird 30.0 / SeaMonkey 2.27), żądania synchroniczne w głównym wątku zostały wycofane z powodu negatywnego wpływu na wrażenia użytkownika.

Należy wykonać żądanie asynchroniczne i obsłużyć odpowiedź w module obsługi zdarzeń.

function httpGetAsync(theUrl, callback)
{
    var xmlHttp = new XMLHttpRequest();
    xmlHttp.onreadystatechange = function() { 
        if (xmlHttp.readyState == 4 && xmlHttp.status == 200)
            callback(xmlHttp.responseText);
    }
    xmlHttp.open("GET", theUrl, true); // true for asynchronous 
    xmlHttp.send(null);
}

2
Cóż, oczywiście, że JavaScript ma wbudowaną funkcję lub w jaki sposób każda biblioteka JavaScript może zaoferować wygodną metodę? Różnica polega na tym, że metody wygody oferują, no cóż, wygodę i jaśniejszą, prostszą składnię.
— Pistos

37
Dlaczego prefiks XML?
— AlikElzin-kilaka

9
Prefiks XML, ponieważ używa X z AJAX ~ asynchronicznego JavaScript i XML . Warto też wspomnieć, że „ API, które ma i wiązanie ECMAScript ” wynika z faktu, że JavaScript może być w wielu rzeczach, innych niż przeglądarki obsługujące HTTP (np. Adobe Reader ...) Warto pamiętać, więc czapki z głów PointedEars.
— będzie

7
@ AlikElzin-kilaka Właściwie wszystkie powyższe odpowiedzi są nie na miejscu (w rzeczywistości połączone dokumenty W3 wyjaśniają „każdy element tej nazwy może wprowadzać w błąd”). Poprawna odpowiedź? jego po prostu źle nazwany stackoverflow.com/questions/12067185/...
— Ashley Coolman

2
Sprowadzić api oferuje lepszy sposób to zrobić i może być polyfilled kiedy jest to konieczne (patrz @ PeterGibson za odpowiedź poniżej ).
— Dominus.Vobiscum

190

W jQuery :

$.get(
    "somepage.php",
    {paramOne : 1, paramX : 'abc'},
    function(data) {
       alert('page content: ' + data);
    }
);

4
zauważ, że to nie działa w IE 10, gdy próbujesz uzyskać dostęp do adresu URL w innej domenie niż domena strony
— BornToCode

5
@BornToCode powinieneś zbadać dalej i być może otworzyć błąd w narzędziu do śledzenia problemów jQuery w tym przypadku
— ashes999

91
Wiem, że niektórzy ludzie chcą pisać czysty Javascript. Rozumiem. Nie mam problemu z ludźmi, którzy robią to w swoich projektach. Moje „In jQuery:” powinno być interpretowane jako „Wiem, że pytałeś, jak to zrobić w JavaScript, ale pozwól, że pokażę ci, jak byś to zrobił za pomocą jQuery, aby wzbudzić twoją ciekawość, widząc, jaki rodzaj zwięzłości składni i przejrzystość, z której możesz korzystać, korzystając z tej biblioteki, która zapewniłaby Ci również wiele innych korzyści i narzędzi ”.
— Pistos

34
Zauważ też, że oryginalny plakat później powiedział: „Dzięki za wszystkie odpowiedzi! Poszedłem z jQuery na podstawie niektórych rzeczy, które przeczytałem na ich stronie”.
— Pistos

153

Wiele świetnych porad powyżej, ale niezbyt wielokrotnego użytku i zbyt często wypełnionych nonsensami DOM i innymi puchami, które ukrywają łatwy kod.

Oto utworzona przez nas klasa JavaScript, która jest wielokrotnego użytku i łatwa w użyciu. Obecnie ma tylko metodę GET, ale to działa dla nas. Dodanie POST nie powinno obciążać niczyich umiejętności.

var HttpClient = function() {
    this.get = function(aUrl, aCallback) {
        var anHttpRequest = new XMLHttpRequest();
        anHttpRequest.onreadystatechange = function() { 
            if (anHttpRequest.readyState == 4 && anHttpRequest.status == 200)
                aCallback(anHttpRequest.responseText);
        }

        anHttpRequest.open( "GET", aUrl, true );            
        anHttpRequest.send( null );
    }
}

Korzystanie z niego jest tak proste, jak:

var client = new HttpClient();
client.get('http://some/thing?with=arguments', function(response) {
    // do something with response
});

Błąd UnCaughtReference, HttpClient nie jest zdefiniowany. Dostaję tę pierwszą linię sam.
— sashikanta

Jak to nazwać z html onClick?
— Gobliins,

Utwórz inną funkcję, w której znajduje się klient var ... i po prostu uruchom functionName (); zwracać fałsz; w onClick
— mail929

1
ReferenceError: XMLHttpRequest is not defined
— Bugs Buggy,

122

Nowe window.fetchAPI jest czystszym zamiennikiem, XMLHttpRequestktóry korzysta z obietnic ES6. Jest ładny wyjaśnienie tutaj , ale sprowadza się do (z artykułu):

fetch(url).then(function(response) {
  return response.json();
}).then(function(data) {
  console.log(data);
}).catch(function() {
  console.log("Booo");
});

Obsługa przeglądarek jest teraz dobra w najnowszych wydaniach (działa w Chrome, Firefox, Edge (v14), Safari (v10.1), Opera, Safari iOS (v10.3), przeglądarka Android i Chrome na Androida), jednak IE będzie prawdopodobnie nie otrzyma oficjalnego wsparcia. GitHub ma polifill udostępnia który jest zalecany do obsługi starszych przeglądarek, które nadal są w dużej mierze w użyciu (szczególnie wersje Safari sprzed marca 2017 i przeglądarki mobilne z tego samego okresu).

Myślę, że jest to wygodniejsze niż jQuery lub XMLHttpRequest, czy nie, zależy od charakteru projektu.

Oto link do specyfikacji https://fetch.spec.whatwg.org/

Edytować :

Używając asynchronicznego / oczekującego ES7, staje się to po prostu (na podstawie tej Gist ):

async function fetchAsync (url) {
  let response = await fetch(url);
  let data = await response.json();
  return data;
}

9
Mógłbym komuś zaoszczędzić trochę czasu, wspominając, że możesz to zrobić, aby dołączyć poświadczenia do żądania:fetch(url, { credentials:"include" })
— Enselic

@ bugmenot123 window.fetchnie jest dostarczany z analizatorem XML, ale możesz samodzielnie przeanalizować odpowiedź, jeśli potraktujesz ją jako tekst (a nie json, jak w powyższym przykładzie). Zobacz stackoverflow.com/a/37702056/66349 dla przykładu
— Peter Gibson

94

Wersja bez oddzwaniania

var i = document.createElement("img");
i.src = "/your/GET/url?params=here";

2
Świetny! Potrzebowałem skryptu Greasemonkey, aby utrzymać sesję przy życiu, a ten fragment jest idealny. Właśnie zawinąłem w setIntervalrozmowę.
— Carcamano,

9
jak uzyskać wynik?
— user4421975,

@ user4421975 Nie dostaniesz - aby uzyskać dostęp do odpowiedzi na żądanie, należy zamiast tego użyć wyżej wspomnianego XMLHttpRequest.
— Jakub Pastuszuk

74

Oto kod do zrobienia tego bezpośrednio za pomocą JavaScript. Ale, jak wspomniano wcześniej, lepiej byłoby skorzystać z biblioteki JavaScript. Moim ulubionym jest jQuery.

W poniższym przypadku wywoływana jest strona ASPX (która służy jako usługa REST biednego człowieka) w celu zwrócenia obiektu JSON JavaScript.

var xmlHttp = null;

function GetCustomerInfo()
{
    var CustomerNumber = document.getElementById( "TextBoxCustomerNumber" ).value;
    var Url = "GetCustomerInfoAsJson.aspx?number=" + CustomerNumber;

    xmlHttp = new XMLHttpRequest(); 
    xmlHttp.onreadystatechange = ProcessRequest;
    xmlHttp.open( "GET", Url, true );
    xmlHttp.send( null );
}

function ProcessRequest() 
{
    if ( xmlHttp.readyState == 4 && xmlHttp.status == 200 ) 
    {
        if ( xmlHttp.responseText == "Not found" ) 
        {
            document.getElementById( "TextBoxCustomerName"    ).value = "Not found";
            document.getElementById( "TextBoxCustomerAddress" ).value = "";
        }
        else
        {
            var info = eval ( "(" + xmlHttp.responseText + ")" );

            // No parsing necessary with JSON!        
            document.getElementById( "TextBoxCustomerName"    ).value = info.jsonData[ 0 ].cmname;
            document.getElementById( "TextBoxCustomerAddress" ).value = info.jsonData[ 0 ].cmaddr1;
        }                    
    }
}

33
Ponieważ ta odpowiedź jest jednym z najlepszych wyników wyszukiwania w Google „javascript żądania HTTP”, warto wspomnieć, że uruchamianie eval na takich danych odpowiedzi jest uważane za złą praktykę
— Kloar

9
@Kloar dobry punkt, ale byłoby jeszcze lepiej podać powód, dla którego jest zły, co, jak sądzę, jest bezpieczeństwem. Wyjaśnienie, dlaczego praktyki są złe, jest najlepszym sposobem na zmianę nawyków.
— Balmipour,

43

Nowoczesna wersja kopiuj-wklej (używając funkcji pobierania i strzałek ) :

//Option with catch
fetch( textURL )
   .then(async r=> console.log(await r.text()))
   .catch(e=>console.error('Boo...' + e));

//No fear...
(async () =>
    console.log(
            (await (await fetch( jsonURL )).json())
            )
)();

Klasyczna wersja kopiuj-wklej:

let request = new XMLHttpRequest();
request.onreadystatechange = function () {
    if (this.readyState === 4) {
        if (this.status === 200) {
            document.body.className = 'ok';
            console.log(this.responseText);
        } else if (this.response == null && this.status === 0) {
            document.body.className = 'error offline';
            console.log("The computer appears to be offline.");
        } else {
            document.body.className = 'error';
        }
    }
};
request.open("GET", url, true);
request.send(null);

36

Krótkie i czyste:

const http = new XMLHttpRequest()

http.open("GET", "https://api.lyrics.ovh/v1/toto/africa")
http.send()

http.onload = () => console.log(http.responseText)


19

IE będzie buforować adresy URL, aby przyspieszyć ładowanie, ale jeśli, powiedzmy, odpytujesz serwer w odstępach czasu, próbując uzyskać nowe informacje, IE zbuforuje ten adres URL i prawdopodobnie zwróci ten sam zestaw danych, który zawsze miałeś.

Niezależnie od tego, jak ostatecznie wykonasz żądanie GET - waniliowy JavaScript, prototyp, jQuery itp. - upewnij się, że wprowadziłeś mechanizm do walki z buforowaniem. Aby temu przeciwdziałać, dołącz unikalny token na końcu adresu URL, który chcesz trafić. Można to zrobić przez:

var sURL = '/your/url.html?' + (new Date()).getTime();

Spowoduje to dodanie unikatowego znacznika czasu na końcu adresu URL i zapobiegnie buforowaniu.


12

Prototyp sprawia, że ​​jest to bardzo proste

new Ajax.Request( '/myurl', {
  method:  'get',
  parameters:  { 'param1': 'value1'},
  onSuccess:  function(response){
    alert(response.responseText);
  },
  onFailure:  function(){
    alert('ERROR');
  }
});

2
Problem polega na tym, że Mac OS X nie jest fabrycznie wyposażony w Prototype. Ponieważ widget musi działać na dowolnym komputerze, w tym Prototyp (lub jQuery) w każdym widżecie nie jest najlepszym rozwiązaniem.
— kiamlaluno

@kiamlaluno używa Prototypowego cdn z cloudflare
— Vladimir Stazhilov

10

Jedno rozwiązanie obsługujące starsze przeglądarki:

function httpRequest() {
    var ajax = null,
        response = null,
        self = this;

    this.method = null;
    this.url = null;
    this.async = true;
    this.data = null;

    this.send = function() {
        ajax.open(this.method, this.url, this.asnyc);
        ajax.send(this.data);
    };

    if(window.XMLHttpRequest) {
        ajax = new XMLHttpRequest();
    }
    else if(window.ActiveXObject) {
        try {
            ajax = new ActiveXObject("Msxml2.XMLHTTP.6.0");
        }
        catch(e) {
            try {
                ajax = new ActiveXObject("Msxml2.XMLHTTP.3.0");
            }
            catch(error) {
                self.fail("not supported");
            }
        }
    }

    if(ajax == null) {
        return false;
    }

    ajax.onreadystatechange = function() {
        if(this.readyState == 4) {
            if(this.status == 200) {
                self.success(this.responseText);
            }
            else {
                self.fail(this.status + " - " + this.statusText);
            }
        }
    };
}

Może nieco przesada, ale na pewno skorzystasz z tego kodu.

Stosowanie:

//create request with its porperties
var request = new httpRequest();
request.method = "GET";
request.url = "https://example.com/api?parameter=value";

//create callback for success containing the response
request.success = function(response) {
    console.log(response);
};

//and a fail callback containing the error
request.fail = function(error) {
    console.log(error);
};

//and finally send it away
request.send();

2
Czy ludzie mogą komentować to, co zrobiłem źle? Niezbyt pomocny w ten sposób!
— flyingP0tat0

Moim zdaniem najlepsza odpowiedź, jeśli ktoś koduje w ES5 przy użyciu zwykłego javascript.
— CoderX

8

Nie jestem zaznajomiony z widżetami kodów kreskowych Mac OS, ale jeśli pozwalają one na używanie bibliotek JavaScript i obsługę XMLHttpRequests , użyłbym jQuery i zrobiłbym coś takiego:

var page_content;
$.get( "somepage.php", function(data){
    page_content = data;
});

5

W pliku Info.plist widżetu nie zapomnij ustawić swojego AllowNetworkAccessklucza na true.


5

Najlepszym sposobem jest użycie AJAX (prosty tutorial na tej stronie Tizag ). Powodem jest to, że każda inna technika, której możesz użyć, wymaga więcej kodu, nie gwarantuje się pracy w różnych przeglądarkach bez przeróbek i wymaga użycia większej ilości pamięci klienta poprzez otwieranie ukrytych stron w ramkach, przekazując adresy URL analizując ich dane i zamykając je. AJAX jest sposobem na wyjście w tej sytuacji. Że moje dwa lata intensywnego rozwoju javascript mówią.


5

Dla tych, którzy używają AngularJs , jest to $http.get:

$http.get('/someUrl').
  success(function(data, status, headers, config) {
    // this callback will be called asynchronously
    // when the response is available
  }).
  error(function(data, status, headers, config) {
    // called asynchronously if an error occurs
    // or server returns response with an error status.
  });

5

Żądanie HTTP GET można uzyskać na dwa sposoby:

  1. To podejście oparte na formacie xml. Musisz podać adres URL żądania.

    xmlhttp.open("GET","URL",true);
    xmlhttp.send();
  2. Ten oparty jest na jQuery. Musisz podać adres URL i nazwę funkcji, do której chcesz zadzwonić.

    $("btn").click(function() {
      $.ajax({url: "demo_test.txt", success: function_name(result) {
        $("#innerdiv").html(result);
      }});
    }); 

5

Aby to zrobić, Fetch API jest zalecanym podejściem przy użyciu obietnic JavaScript. XMLHttpRequest (XHR), obiekt IFrame lub znaczniki dynamiczne są starszymi (i bardziej niezgrabnymi) podejściami.

<script type=“text/javascript”> 
    // Create request object 
    var request = new Request('https://example.com/api/...', 
         { method: 'POST', 
           body: {'name': 'Klaus'}, 
           headers: new Headers({ 'Content-Type': 'application/json' }) 
         });
    // Now use it! 

   fetch(request) 
   .then(resp => { 
         // handle response }) 
   .catch(err => { 
         // handle errors 
    }); </script>

Oto świetne demo pobierania i dokumenty MDN


4
function get(path) {
    var form = document.createElement("form");
    form.setAttribute("method", "get");
    form.setAttribute("action", path);
    document.body.appendChild(form);
    form.submit();
}


get('/my/url/')

To samo można zrobić w przypadku żądania wysłania.
Spójrz na ten link Żądanie wpisu JavaScript jak formularz


4

Proste żądanie asynchroniczne:

function get(url, callback) {
  var getRequest = new XMLHttpRequest();

  getRequest.open("get", url, true);

  getRequest.addEventListener("readystatechange", function() {
    if (getRequest.readyState === 4 && getRequest.status === 200) {
      callback(getRequest.responseText);
    }
  });

  getRequest.send();
}


2
// Create a request variable and assign a new XMLHttpRequest object to it.
var request = new XMLHttpRequest()

// Open a new connection, using the GET request on the URL endpoint
request.open('GET', 'restUrl', true)

request.onload = function () {
  // Begin accessing JSON data here
}

// Send request
request.send()

1

Jeśli chcesz użyć kodu widżetu Dashboard i nie chcesz dołączać biblioteki JavaScript do każdego utworzonego widgetu, możesz użyć obiektu XMLHttpRequest, który Safari domyślnie obsługuje.

Jak donosi Andrew Hedges, widget domyślnie nie ma dostępu do sieci; musisz zmienić to ustawienie w info.plist powiązanym z widżetem.


1

Aby odświeżyć najlepszą odpowiedź od joanna z obietnicą, oto mój kod:

let httpRequestAsync = (method, url) => {
    return new Promise(function (resolve, reject) {
        var xhr = new XMLHttpRequest();
        xhr.open(method, url);
        xhr.onload = function () {
            if (xhr.status == 200) {
                resolve(xhr.responseText);
            }
            else {
                reject(new Error(xhr.responseText));
            }
        };
        xhr.send();
    });
}

1

Nowoczesne, czyste i najkrótsze

fetch('https://www.randomtext.me/api/lorem')


0

Możesz to zrobić również z czystym JS:

// Create the XHR object.
function createCORSRequest(method, url) {
  var xhr = new XMLHttpRequest();
if ("withCredentials" in xhr) {
// XHR for Chrome/Firefox/Opera/Safari.
xhr.open(method, url, true);
} else if (typeof XDomainRequest != "undefined") {
// XDomainRequest for IE.
xhr = new XDomainRequest();
xhr.open(method, url);
} else {
// CORS not supported.
xhr = null;
}
return xhr;
}

// Make the actual CORS request.
function makeCorsRequest() {
 // This is a sample server that supports CORS.
 var url = 'http://html5rocks-cors.s3-website-us-east-1.amazonaws.com/index.html';

var xhr = createCORSRequest('GET', url);
if (!xhr) {
alert('CORS not supported');
return;
}

// Response handlers.
xhr.onload = function() {
var text = xhr.responseText;
alert('Response from CORS request to ' + url + ': ' + text);
};

xhr.onerror = function() {
alert('Woops, there was an error making the request.');
};

xhr.send();
}

Zobacz: więcej szczegółów: tutorial html5rocks


0
<button type="button" onclick="loadXMLDoc()"> GET CONTENT</button>

 <script>
        function loadXMLDoc() {
            var xmlhttp = new XMLHttpRequest();
            var url = "<Enter URL>";``
            xmlhttp.onload = function () {
                if (xmlhttp.readyState == 4 && xmlhttp.status == "200") {
                    document.getElementById("demo").innerHTML = this.responseText;
                }
            }
            xmlhttp.open("GET", url, true);
            xmlhttp.send();
        }
    </script>

-1

Oto alternatywa dla plików XML do ładowania plików jako obiektu i uzyskiwania dostępu do właściwości jako obiektu w bardzo szybki sposób.

  • Uwaga, aby javascript mógł go poprawnie interpretować, konieczne jest zapisanie plików w tym samym formacie co strona HTML. Jeśli używasz UTF 8, zapisz swoje pliki w UTF8 itp.

XML działa jak drzewo, dobrze? zamiast pisać

     <property> value <property> 

napisz prosty plik taki jak ten:

      Property1: value
      Property2: value
      etc.

Zapisz plik .. Teraz wywołaj funkcję ....

    var objectfile = {};

function getfilecontent(url){
    var cli = new XMLHttpRequest();

    cli.onload = function(){
         if((this.status == 200 || this.status == 0) && this.responseText != null) {
        var r = this.responseText;
        var b=(r.indexOf('\n')?'\n':r.indexOf('\r')?'\r':'');
        if(b.length){
        if(b=='\n'){var j=r.toString().replace(/\r/gi,'');}else{var j=r.toString().replace(/\n/gi,'');}
        r=j.split(b);
        r=r.filter(function(val){if( val == '' || val == NaN || val == undefined || val == null ){return false;}return true;});
        r = r.map(f => f.trim());
        }
        if(r.length > 0){
            for(var i=0; i<r.length; i++){
                var m = r[i].split(':');
                if(m.length>1){
                        var mname = m[0];
                        var n = m.shift();
                        var ivalue = m.join(':');
                        objectfile[mname]=ivalue;
                }
            }
        }
        }
    }
cli.open("GET", url);
cli.send();
}

teraz możesz efektywnie uzyskiwać swoje wartości.

getfilecontent('mesite.com/mefile.txt');

window.onload = function(){

if(objectfile !== null){
alert (objectfile.property1.value);
}
}

To tylko mały prezent, który można wnieść do grupy. Dzięki za polubienie :)

Jeśli chcesz przetestować tę funkcję na komputerze PC, uruchom ponownie przeglądarkę, wykonując następujące polecenie (obsługiwane przez wszystkie przeglądarki oprócz safari):

yournavigator.exe '' --allow-file-access-from-files
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.