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%
$.get(
"somepage.php",
{paramOne : 1, paramX : 'abc'},
function(data) {
alert('page content: ' + data);
}
);
Antwoord 3, autoriteit 13%
De nieuwe window.fetch
API is een schonere vervanging voor XMLHttpRequest
die 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 AllowNetworkAccess
Sleutel 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:
-
Deze aanpak op basis van XML-indeling. U moet de URL doorgeven voor het verzoek.
xmlhttp.open("GET","URL",true); xmlhttp.send();
-
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
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>