Permintaan HTTP GET dalam JavaScript?

Jawaban:

1207

Browser (dan Dashcode) menyediakan objek XMLHttpRequest yang dapat digunakan untuk membuat permintaan HTTP dari JavaScript:

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

Namun, permintaan sinkron tidak disarankan dan akan menghasilkan peringatan di sepanjang baris:

Catatan: Dimulai dengan Gecko 30.0 (Firefox 30.0 / Thunderbird 30.0 / SeaMonkey 2.27), permintaan sinkron pada utas utama telah ditinggalkan karena efek negatif terhadap pengalaman pengguna.

Anda harus membuat permintaan asinkron dan menangani respons di dalam pengendali event.

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);
}
Joan
sumber
2
Yah, tentu saja Javascript sudah membuatnya, atau bagaimana mungkin perpustakaan Javascript menawarkan metode kenyamanan untuk itu? Perbedaannya adalah bahwa metode kenyamanan menawarkan, baik, kenyamanan, dan sintaksis yang lebih jelas, lebih sederhana.
Pistos
37
Mengapa awalan XML`?
AlikElzin-kilaka
9
Awalan XML karena menggunakan X dari AJAX ~ Asynchronous JavaScript and XML . Juga, poin bagus dari " API yang memiliki dan pengikatan ECMAScript " adalah karena fakta bahwa JavaScript bisa ada dalam banyak hal, selain browser yang mendukung HTTP (misalnya, seperti Adobe Reader ...) Hal yang baik untuk diingat jadi topi untuk PointedEars.
akan
7
@ AlikElzin-kilaka Sebenarnya semua jawaban di atas tidak sesuai sasaran (bahkan dokumen W3 yang ditautkan menjelaskan "setiap komponen dari nama ini berpotensi menyesatkan"). Jawaban yang benar? yang hanya bernama stackoverflow.com/questions/12067185/…
Ashley Coolman
2
The mengambil API menawarkan cara yang lebih baik untuk melakukan hal ini, dan dapat polyfilled bila perlu (lihat @ PeterGibson ini jawaban di bawah ini ).
Dominus.Vobiscum
190

Di jQuery :

$.get(
    "somepage.php",
    {paramOne : 1, paramX : 'abc'},
    function(data) {
       alert('page content: ' + data);
    }
);
Pistos
sumber
4
perhatikan bahwa ini tidak berfungsi di IE 10 ketika mencoba mengakses url di domain yang berbeda dari domain halaman
BornToCode
5
@BornToCode Anda harus menyelidiki lebih lanjut dan mungkin membuka bug pada pelacak masalah jQuery dalam kasus itu
ashes999
92
Saya tahu beberapa orang ingin menulis Javascript murni. Saya mengerti. Saya tidak punya masalah dengan orang-orang yang melakukan itu di proyek mereka. "Dalam jQuery:" saya harus diartikan sebagai "Saya tahu Anda bertanya bagaimana melakukannya dalam Javascript, tetapi biarkan saya menunjukkan kepada Anda bagaimana Anda akan melakukannya dengan jQuery, agar rasa ingin tahu Anda terguncang dengan melihat seperti apa keringkasan sintaksis dan kejelasan Anda dapat menikmati dengan menggunakan perpustakaan ini, yang akan memberi Anda banyak keuntungan dan alat lainnya juga ".
Pistos
34
Perhatikan juga bahwa poster asli kemudian berkata: "Terima kasih atas semua jawaban! Saya pergi dengan jQuery berdasarkan beberapa hal yang saya baca di situs mereka.".
Pistos
153

Banyak saran bagus di atas, tetapi tidak terlalu dapat digunakan kembali, dan terlalu sering diisi dengan DOM omong kosong dan bulu-bulu lain yang menyembunyikan kode mudah.

Inilah kelas Javascript yang kami buat yang dapat digunakan kembali dan mudah digunakan. Saat ini hanya memiliki metode GET, tetapi itu bekerja untuk kita. Menambahkan POST seharusnya tidak membebani keterampilan siapa pun.

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 );
    }
}

Menggunakannya semudah:

var client = new HttpClient();
client.get('http://some/thing?with=arguments', function(response) {
    // do something with response
});
tggagne
sumber
Kesalahan UnCaughtReference, HttpClient tidak didefinisikan. Saya mendapatkan baris pertama ini sendiri.
sashikanta
Bagaimana Anda menyebutnya dari html onClick?
Gobliins
Buat fungsi lain di mana yang berisi klien var ... dan jalankan functionName (); return false; di onClick
mail929
1
ReferenceError: XMLHttpRequest is not defined
Bugs Buggy
123

window.fetchAPI baru adalah pengganti yang lebih bersih untuk XMLHttpRequestyang menggunakan janji-janji ES6. Ada penjelasan yang bagus di sini , tetapi intinya adalah (dari artikel):

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

Dukungan browser sekarang bagus dalam rilis terbaru (berfungsi di Chrome, Firefox, Edge (v14), Safari (v10.1), Opera, Safari iOS (v10.3), browser Android, dan Chrome untuk Android), namun IE akan kemungkinan tidak mendapatkan dukungan resmi. GitHub memiliki polyfill yang tersedia yang direkomendasikan untuk mendukung browser lama yang sebagian besar masih digunakan (terutama versi Safari sebelum Maret 2017 dan browser seluler dari periode yang sama).

Saya kira apakah ini lebih nyaman daripada jQuery atau XMLHttpRequest atau tidak tergantung pada sifat proyek.

Berikut tautan ke spec https://fetch.spec.whatwg.org/

Edit :

Menggunakan ES7 async / menunggu, ini menjadi sederhana (berdasarkan Gist ini ):

async function fetchAsync (url) {
  let response = await fetch(url);
  let data = await response.json();
  return data;
}
Peter Gibson
sumber
9
Saya dapat menghemat waktu seseorang dengan menyebutkan bahwa Anda dapat melakukan ini untuk memasukkan kredensial dalam permintaan:fetch(url, { credentials:"include" })
Enselic
@ bugmenot123 window.fetchtidak datang dengan parser XML, tetapi Anda dapat mengurai sendiri respons jika Anda menanganinya sebagai teks (bukan json seperti pada contoh di atas). Lihat stackoverflow.com/a/37702056/66349 untuk contoh
Peter Gibson
94

Versi tanpa panggilan balik

var i = document.createElement("img");
i.src = "/your/GET/url?params=here";
aNieto2k
sumber
2
Luar biasa! Saya membutuhkan skrip Greasemonkey untuk menjaga sesi tetap hidup dan cuplikan ini sempurna. Hanya membungkusnya dengan setIntervalpanggilan.
Carcamano
9
bagaimana saya mendapatkan hasilnya?
user4421975
@ user4421975 Anda tidak mendapatkan - untuk mendapatkan akses ke permintaan tanggapan, Anda harus menggunakan XMLHttpRequest sebagai gantinya.
Jakub Pastuszuk
74

Berikut adalah kode untuk melakukannya secara langsung dengan JavaScript. Tetapi, seperti yang disebutkan sebelumnya, Anda akan jauh lebih baik dengan perpustakaan JavaScript. Favorit saya adalah jQuery.

Dalam kasus di bawah ini, halaman ASPX (yang berfungsi sebagai layanan REST orang miskin) dipanggil untuk mengembalikan objek JavaScript JSON.

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;
        }                    
    }
}
rp.
sumber
33
Karena jawaban ini adalah salah satu hasil teratas untuk googling "http request javascript", perlu disebutkan bahwa menjalankan eval pada data respons seperti itu dianggap praktik buruk
Kloar
9
@Kloar poin bagus, tetapi akan lebih baik untuk memberikan alasan mengapa itu buruk, yang saya kira adalah keamanan. Menjelaskan mengapa praktik itu buruk adalah cara terbaik untuk membuat orang mengubah kebiasaan mereka.
Balmipour
43

Versi modern salin-tempel (menggunakan fungsi ambil dan panah ) :

//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())
            )
)();

Versi klasik salin-tempel:

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);
Daniel De León
sumber
36

Pendek dan bersih:

const http = new XMLHttpRequest()

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

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

Damjan Pavlica
sumber
19

IE akan men-cache URL untuk membuat pemuatan lebih cepat, tetapi jika Anda, katakanlah, polling server pada interval waktu yang mencoba untuk mendapatkan informasi baru, IE akan menyimpan cache URL itu dan kemungkinan akan mengembalikan set data yang sama seperti yang selalu Anda miliki.

Terlepas dari bagaimana Anda akhirnya melakukan permintaan GET Anda - vanilla JavaScript, Prototype, jQuery, dll - pastikan Anda menempatkan mekanisme untuk memerangi caching. Untuk mengatasi itu, tambahkan token unik ke bagian akhir URL yang akan Anda pukul. Ini dapat dilakukan dengan:

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

Ini akan menambahkan stempel waktu unik ke akhir URL dan akan mencegah terjadinya caching.

Tom
sumber
12

Prototipe membuatnya sangat sederhana

new Ajax.Request( '/myurl', {
  method:  'get',
  parameters:  { 'param1': 'value1'},
  onSuccess:  function(response){
    alert(response.responseText);
  },
  onFailure:  function(){
    alert('ERROR');
  }
});
Mark Biek
sumber
2
Masalahnya adalah bahwa Mac OS X tidak datang dengan Prototipe pra-instal. Karena widget harus dijalankan di komputer mana pun, termasuk Prototipe (atau jQuery) di setiap widget bukanlah solusi terbaik.
kiamlaluno
@kiamlaluno menggunakan Prototipe cdn dari cloudflare
Vladimir Stazhilov
10

Satu solusi yang mendukung browser lama:

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);
            }
        }
    };
}

Mungkin agak berlebihan tetapi Anda pasti aman dengan kode ini.

Pemakaian:

//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();
flyingP0tat0
sumber
2
Bisakah orang memberi komentar tentang kesalahan saya? Tidak sangat membantu dengan cara itu!
flyingP0tat0
Jawaban terbaik menurut saya, jika ada yang coding di ES5 menggunakan javascript biasa.
CoderX
8

Saya tidak terbiasa dengan Mac OS Dashcode Widgets, tetapi jika mereka membiarkan Anda menggunakan perpustakaan JavaScript dan mendukung XMLHttpRequests , saya akan menggunakan jQuery dan melakukan sesuatu seperti ini:

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

Dalam file Info.plist widget Anda, jangan lupa untuk mengatur AllowNetworkAccesskunci Anda menjadi true.

Andrew Hedges
sumber
5

Cara terbaik adalah dengan menggunakan AJAX (Anda dapat menemukan tutorial sederhana di halaman ini Tizag ). Alasannya adalah bahwa teknik lain yang Anda gunakan memerlukan lebih banyak kode, itu tidak dijamin untuk bekerja lintas browser tanpa pengerjaan ulang dan mengharuskan Anda menggunakan lebih banyak memori klien dengan membuka halaman tersembunyi di dalam frame lewat url mengurai data mereka dan menutupnya. AJAX adalah cara untuk masuk dalam situasi ini. Itu saya dua tahun javascript berbicara pengembangan berat.

Nikola Stjelja
sumber
5

Bagi mereka yang menggunakan AngularJs , itu $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.
  });
Vitalii Fedorenko
sumber
5

Anda bisa mendapatkan permintaan HTTP GET dengan dua cara:

  1. Pendekatan ini berdasarkan format xml. Anda harus melewati URL untuk permintaan tersebut.

    xmlhttp.open("GET","URL",true);
    xmlhttp.send();
  2. Yang ini didasarkan pada jQuery. Anda harus menentukan URL dan function_name yang ingin Anda panggil.

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

Untuk melakukan ini Ambil API adalah pendekatan yang disarankan, menggunakan JavaScript Janji. XMLHttpRequest (XHR), objek IFrame atau tag dinamis adalah pendekatan yang lebih lama (dan lebih rumit).

<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>

Ini demo pengambilan dan MDN yang bagus

aabiro
sumber
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/')

Hal yang sama dapat dilakukan untuk permintaan pos juga.
Silakan lihat tautan permintaan posting JavaScript ini seperti formulir kirim

Gaurav Gupta
sumber
4

Permintaan async sederhana:

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();
}
Diterjemahkan sebagai junior
sumber
2

Ajax

Anda sebaiknya menggunakan perpustakaan seperti Prototipe atau jQuery .

Greg
sumber
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()
Pradeep Maurya
sumber
1

Jika Anda ingin menggunakan kode untuk widget Dashboard, dan Anda tidak ingin menyertakan perpustakaan JavaScript di setiap widget yang Anda buat, maka Anda dapat menggunakan objek XMLHttpRequest yang didukung Safari secara asli.

Seperti yang dilaporkan oleh Andrew Hedges, widget tidak memiliki akses ke jaringan, secara default; Anda perlu mengubah pengaturan itu di info.plist yang terkait dengan widget.

kiamlaluno
sumber
1

Untuk menyegarkan jawaban terbaik dari joann dengan janji ini adalah kode saya:

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();
    });
}
negstek
sumber
1

Modern, bersih, dan terpendek

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

Kamil Kiełczewski
sumber
0

Anda dapat melakukannya dengan JS murni juga:

// 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();
}

Lihat: untuk detail lebih lanjut: tutorial html5rocks

jpereira
sumber
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>
Rama
sumber
-1

Berikut ini adalah alternatif untuk file xml untuk memuat file Anda sebagai objek dan mengakses properti sebagai objek dengan cara yang sangat cepat.

  • Perhatian, agar javascript dapat dia dan untuk menafsirkan konten dengan benar perlu untuk menyimpan file Anda dalam format yang sama dengan halaman HTML Anda. Jika Anda menggunakan UTF 8, simpan file Anda di UTF8, dll.

XML berfungsi sebagai pohon ok? alih-alih menulis

     <property> value <property> 

tulis file sederhana seperti ini:

      Property1: value
      Property2: value
      etc.

Simpan file Anda .. Sekarang panggil fungsi ....

    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();
}

sekarang Anda bisa mendapatkan nilai-nilai Anda secara efisien.

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

window.onload = function(){

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

Ini hanya hadiah kecil untuk contibute ke grup. Terima kasih atas kesukaan Anda :)

Jika Anda ingin menguji fungsi pada PC Anda secara lokal, restart browser Anda dengan perintah berikut (didukung oleh semua browser kecuali safari):

yournavigator.exe '' --allow-file-access-from-files
Cherif
sumber