HTTP GET-verzoek in JavaScript?

Ik moet een HTTP GET-verzoek in JavaScript doen. Wat is de beste manier om dat te doen?

Ik moet dit doen in een Mac OS X dashcode-widget.


Antwoord 1, autoriteit 100%

Browsers (en Dashcode) bieden een XMLHttpRequest-object dat kan worden gebruikt om HTTP-verzoeken te doen vanuit JavaScript:

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

Synchroon verzoeken worden echter afgeraden en genereren een waarschuwing in de trant van:

Opmerking: vanaf Gecko 30.0 (Firefox 30.0 / Thunderbird 30.0 / SeaMonkey 2.27) zijn synchrone verzoeken op de hoofdthread afgeschaftvanwege de negatieve effecten op de gebruikerservaring.

U moet een asynchroon verzoek indienen en het antwoord afhandelen in een gebeurtenishandler.

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

Antwoord 2, autoriteit 15%

In jQuery:

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

Antwoord 3, autoriteit 13%

De nieuwe window.fetchAPI is een schonere vervanging voor XMLHttpRequestdie gebruik maakt van ES6-beloften. Er is een mooie uitleg hier, maar het komt neer op (uit het artikel):

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

Browserondersteuningis nu goed in de nieuwste releases (werkt in Chrome, Firefox, Edge (v14 ), Safari (v10.1), Opera, Safari iOS (v10.3), Android-browser en Chrome voor Android), maar IE krijgt waarschijnlijk geen officiële ondersteuning. GitHub heeft een polyfillbeschikbaar die wordt aanbevolen om oudere browsers te ondersteunen die nog grotendeels in gebruik zijn (in het bijzonder versies van Safari van vóór maart 2017 en mobiele browsers uit dezelfde periode).

Ik denk dat het van de aard van het project afhangt of dit handiger is dan jQuery of XMLHttpRequest.

Hier is een link naar de spec https://fetch.spec.whatwg.org/

Bewerken:

Met ES7 async/await wordt dit eenvoudig (gebaseerd op deze Gist):

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

Antwoord 4, Autoriteit 12%

Veel van groot advies hierboven, maar niet erg herbruikbaar, en te vaak gevuld met Domonse en andere pluisjes die de eenvoudige code verbergt.

Hier is een JavaScript-klasse die we hebben gemaakt die herbruikbaar en gemakkelijk te gebruiken is. Momenteel heeft het alleen een GET-methode, maar dat werkt voor ons. Het toevoegen van een bericht moet de vaardigheden van iemand niet belasten.

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

het gebruiken is net zo eenvoudig als:

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

Antwoord 5, Autoriteit 7%

een versie zonder terugbellen

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

Antwoord 6, Autoriteit 5%

Hier is code om het rechtstreeks met JavaScript te doen. Maar zoals eerder vermeld, zou je veel beter af zijn met een JavaScript-bibliotheek. Mijn favoriet is jQuery.

In de onderstaande behuizing wordt een ASPX-pagina (dat is onderhoud als de rust van een arme man) geroepen om een ​​JavaScript JSON-object te retourneren.

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

Antwoord 7, autoriteit 4%

Een moderne versie van kopiëren en plakken ( met behulp van ophalenen pijlfunctie):

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

Een klassieke versie van kopiëren en plakken:

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

Antwoord 8, autoriteit 3%

Kort en duidelijk:

const http = new XMLHttpRequest()
http.open("GET", "https://api.lyrics.ovh/v1/toto/africa")
http.send()
http.onload = () => console.log(http.responseText)

Antwoord 9

IE zal URL’s cachen om het laden sneller te laten verlopen, maar als je bijvoorbeeld een server met tussenpozen pollt om nieuwe informatie te krijgen, zal IE die URL cachen en waarschijnlijk dezelfde dataset retourneren die je altijd hebt gehad gehad.

Ongeacht hoe u uw GET-verzoek doet – vanilla JavaScript, Prototype, jQuery, enz. – zorg ervoor dat u een mechanisme installeert om caching tegen te gaan. Om dat te bestrijden, voegt u een uniek token toe aan het einde van de URL die u gaat raken. Dit kan door:

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

Hiermee wordt een unieke tijdstempel aan het einde van de URL toegevoegd en wordt voorkomen dat er caching plaatsvindt.


Antwoord 10

Modern, schoon en kortst

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

Antwoord 11

Prototypemaakt het doodeenvoudig

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

Antwoord 12

Eén oplossing die oudere browsers ondersteunt:

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

Misschien wat overdreven, maar je gaat zeker veilig met deze code.

Gebruik:

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

Antwoord 13

Ik ben niet bekend met Mac OS Dashcode Widgets, maar als ze je JavaScript-bibliotheken laten gebruiken en ondersteuning bieden voor XMLHttpRequests, ik zou jQuerygebruiken en zoiets doen :

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

Antwoord 14

Hiervoor is Fetch API de aanbevolen aanpak, met behulp van JavaScript Promises. XMLHttpRequest (XHR), IFrame-object of dynamische tags zijn oudere (en onhandigere) benaderingen.

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

Hier is een geweldig fetch demo en MDN docs


Antwoord 15

In het info.plistische bestand van uw widget, vergeet niet om uw AllowNetworkAccessSleutel in te stellen op TRUE.


Antwoord 16

De beste manier is om Ajax te gebruiken (u kunt een eenvoudige tutorial vinden op deze pagina tizag ). De reden is dat elke andere techniek die u mag gebruiken, meer code vereist, het is niet gegarandeerd om crossbrowser te werken zonder opnieuw te werken en vereist dat u meer clientgeheugen gebruikt door verborgen pagina’s in de frames te openen die de URL’s van het parseren van hun gegevens doorgeven en deze sluiten.
Ajax is de manier om in deze situatie te gaan. Dat mijn twee jaar javascript zware ontwikkeling spreekt.


Antwoord 17

Voor degenen die angularjs , het is $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.
  });

Antwoord 18

U kunt op twee manieren een HTTP krijgen:

  1. Deze aanpak op basis van XML-indeling. U moet de URL doorgeven voor het verzoek.

    xmlhttp.open("GET","URL",true);
    xmlhttp.send();
    
  2. Deze is gebaseerd op jQuery. U moet de URL en functienaam opgeven die u wilt aanroepen.

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

Antwoord 19

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

Hetzelfde kan ook worden gedaan voor postverzoeken.
Bekijk deze link JavaScript-postverzoek zoals een formulierverzending


Antwoord 20

Eenvoudig asynchronisatieverzoek:

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

Antwoord 21

nu met asynchronus js kunnen we deze methode gebruiken met de fetch() methode om op een meer beknopte manier beloften te doen. Async-functies worden ondersteund in alle moderne browsers.

async function funcName(url){
    const response = await fetch(url);
    var data = await response.json();
    }

Antwoord 22

U kunt AXIOS gebruiken om een ​​ontvangstverzoek te maken die u nodig heeft om het in Package.json te installeren. Den u hier kunt gebruiken is een voorbeeld met GitHub API

axios.get('https://api.github.com/users/mapbox')
  .then((response) => {
    console.log(response.data);
    console.log(response.status);
    console.log(response.statusText);
    console.log(response.headers);
    console.log(response.config);
  });
// logs:
// => {login: "mapbox", id: 600935, node_id: "MDEyOk9yZ2FuaXphdGlvbjYwMDkzNQ==", avatar_url: "https://avatars1.githubusercontent.com/u/600935?v=4", gravatar_id: "", …}
// => 200
// => OK
// => {x-ratelimit-limit: "60", x-github-media-type: "github.v3", x-ratelimit-remaining: "60", last-modified: "Wed, 01 Aug 2018 02:50:03 GMT", etag: "W/"3062389570cc468e0b474db27046e8c9"", …}
// => {adapter: ƒ, transformRequest: {…}, transformResponse: {…}, timeout: 0, xsrfCookieName: "XSRF-TOKEN", …}

Antwoord 23

Ajax

U zou het beste af zijn met behulp van een bibliotheek zoals prototype of jQuery .


Antwoord 24

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

Antwoord 25

Als u de code voor een Dashboard-widget wilt gebruiken en u wilt geen JavaScript-bibliotheek opnemen in elke widget die u heeft gemaakt, dan kunt u het object XMLHttpRequest gebruiken dat Safari standaard ondersteunt.

Zoals gemeld door Andrew Hedges heeft een widget standaard geen toegang tot een netwerk; je moet die instelling wijzigen in de info.plist die aan de widget is gekoppeld.


Antwoord 26

Om het beste antwoord van joann met belofte te vernieuwen, is dit mijn code:

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

Antwoord 27

Je kunt het ook met pure JS doen:

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

Zie: voor meer details: html5rocks-tutorial


Antwoord 28

Hier is een alternatief voor xml-bestanden om uw bestanden als object te laden en op een zeer snelle manier toegang te krijgen tot eigenschappen als object.

  • Let op, zodat javascript hem kan gebruiken en om de inhoud correct te interpreteren is het noodzakelijk om uw bestanden op te slaan in hetzelfde formaat als uw HTML-pagina. Als u UTF 8 gebruikt, slaat u uw bestanden op in UTF8, enz.

XML werkt als een boom ok? in plaats van te schrijven

    <property> value <property> 

schrijf een eenvoudig bestand als volgt:

     Property1: value
      Property2: value
      etc.

Sla je bestand op ..
Roep nu de functie ….

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

Nu kunt u uw waarden efficiënt halen.

getfilecontent('mesite.com/mefile.txt');
window.onload = function(){
if(objectfile !== null){
alert (objectfile.property1.value);
}
}

Het is slechts een klein geschenk aan het verbouwen aan de groep. Bedankt van je zoals 🙂

Als u de functie op uw pc lokaal wilt testen, start u uw browser opnieuw op met de volgende opdracht (ondersteund door alle browsers behalve Safari):

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

Antwoord 29

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

Other episodes