2008-10-29 9 views
562

Мне нужно сделать запрос HTTP GET в JavaScript. Каков наилучший способ сделать это?HTTP GET запрос в JavaScript?

Мне нужно сделать это в виджетах dashcode для Mac OS X.

+8

Обратите внимание, что это зависит от Same Origin Policy. http://en.wikipedia.org/wiki/Same_origin_policy – ripper234 2011-10-06 21:10:02

ответ

926

Вы можете использовать функции, обеспечиваемые среды хостинга через JavaScript:

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

Однако синхронные запросы не рекомендуется, так что вы можете использовать вместо этого:

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

Note: Starting with Gecko 30.0 (Firefox 30.0/Thunderbird 30.0/SeaMonkey 2.27), synchronous requests on the main thread have been deprecated due to the negative effects to the user experience.

68

Вот код, который можно сделать с помощью JavaScript. Но, как уже упоминалось, вам будет намного лучше с библиотекой JavaScript. Моим любимым является jQuery.

В приведенном ниже примере вызывается страница ASPX (обслуживающая службу REST для бедных людей), чтобы вернуть объект 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; 
     }      
    } 
} 
+27

Поскольку этот ответ является одним из лучших результатов для «HTTP-запроса javascript» для googling, стоит упомянуть, что запуск eval по данным ответа, как это считается плохой практикой – Kloar 2014-05-19 09:47:10

+7

@Kloar Хорошая точка, но было бы еще лучше дать причину, почему это плохо, и я думаю, это безопасность. Объяснение, почему практика плоха, это лучший способ заставить людей переключать свои привычки. – Balmipour 2015-09-16 11:16:18

11

Prototype делает его мертвым простой

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

Проблема в том, что Mac OS X не поставляется с предустановленным прототипом. Поскольку виджет должен запускаться на любом компьютере, в том числе Prototype (или jQuery) в каждом виджете, это не лучшее решение. – kiamlaluno 2010-08-07 05:05:52

+0

@kiamlaluno Использовать прототип cdn из cloudflare – 2017-02-14 10:34:19

166

In jQuery:

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

Обратите внимание, что это не работает в IE 10 при попытке получить доступ к URL-адресу в другом домене, чем домен страницы – BornToCode 2013-09-30 09:35:35

+5

@BornToCode вам следует исследовать дальше и, возможно, открыть ошибку в трекер-проблеме jQuery в этом случае – ashes999 2013-10-08 16:58:42

+68

Я знаю, что некоторые люди хотят писать чистый Javascript. Я понимаю. У меня нет проблем с людьми, которые делают это в своих проектах.Мой «В jQuery:» должен быть задуман как «Я знаю, что вы спросили, как это сделать в Javascript, но позвольте мне показать вам, как вы это сделаете с помощью jQuery, чтобы у вас могло возникнуть ваше любопытство, видя, какая синтаксическая лаконичность и ясность, которую вы можете наслаждаться, используя эту библиотеку, которая предоставит вам множество других преимуществ и инструментов ». – Pistos 2014-06-26 19:47:09

14

IE кэширует URL-адреса для того, чтобы сделать загрузку быстрее, но если вы, скажем, опрос сервера с интервалами, пытаясь получить новую информацию, IE будет кэшировать этот URL и, скорее всего, вернет тот же набор данных, который у вас всегда был.

Независимо от того, как вы в конечном итоге выполняете свой запрос GET - ванильный JavaScript, прототип, jQuery и т. Д. - убедитесь, что вы создали механизм для борьбы с кешированием. Чтобы бороться с этим, добавьте уникальный токен в конец URL-адреса, который вы будете бить. Это может быть сделано путем:

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

это добавит уникальную метку времени к концу URL и предотвратить кэширование не происходило.

3

В файле Info.plist вашего виджета не забудьте установить для вашего ключа AllowNetworkAccess значение true.

2

Лучший способ - использовать AJAX (вы можете найти простой учебник на этой странице Tizag). Причина в том, что любой другой метод, который вы можете использовать, требует большего количества кода, не гарантируется работа с кросс-браузером без переделки и требует использования большего количества клиентской памяти, открывая скрытые страницы внутри фреймов, передавая URL-адреса, анализируя их данные и закрывая их. AJAX - это способ пойти в этой ситуации. То, что мои два года javascript тяжелое развитие говорит.

6

Я не знаком с Mac OS Dashcode Widgets, но если они позволяют использовать библиотеки и поддержку XMLHttpRequests JavaScript, я хотел бы использовать jQuery и сделать что-то вроде этого:

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

Если вы хотите использовать код для виджета Dashboard, и вы не хотите включать библиотеку JavaScript в каждый созданный вами виджет, тогда вы можете использовать объект XMLHttpRequest, поддерживаемый Safari.

Как сообщил Эндрю Хеджес, виджет не имеет доступа к сети по умолчанию; вам нужно изменить этот параметр в файле info.plist, связанном с виджетами.

78

версия без обратного вызова

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

Много замечательных советов выше, но не очень многократно используемых и слишком часто заполненных глупостью DOM и другим пухом, который скрывает легкий код.

Вот класс Javascript, который мы создали, который многоразовый и прост в использовании. В настоящее время он имеет только метод GET, но это работает для нас. Добавление POST не должно облагать никакими навыками.

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

С его помощью так же легко, как:

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

Копию паста готовый вариант

var request = new XMLHttpRequest(); 
request.onreadystatechange = function() { 
    if (request.readyState === 4) { 
     if (request.status === 200) { 
      document.body.className = 'ok'; 
      console.log(request.responseText); 
     } else if (!isValid(this.response) && 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); 
2

Вы можете получить запрос HTTP GET двумя способами:

  1. Этот подход основан на формате xml. Вы должны передать URL-адрес для запроса.

    xmlhttp.open("GET","URL",true); 
    xmlhttp.send(); 
    
  2. Этот объект основан на jQuery. Вы должны указать URL и имя_функции, которые хотите вызвать.

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

Для тех, кто использует AngularJs, это $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. 
    }); 
1

Это может оказаться очень полезным, чтобы попытаться REQUESTIFY- библиотеку, упрощающий запрос узел HTTP решений.

https://github.com/ranm8/requestify

var requestify = require('requestify'); 

Получение запроса:

requestify.get('http://example.com').then(function(response) { 
    // Get the response body 
    response.getBody(); 
}); 

И JSON:

requestify.post('http://example.com', { 
     hello: 'world' 
    }) 
    .then(function(response) { 
     // Get the response body (JSON parsed or jQuery object for XMLs) 
     response.getBody(); 

     // Get the raw response body 
     response.body; 
    }); 
2
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/') 

То же самое можно сделать для запроса пост, а также.
Посмотрите на эту ссылку JavaScript post request like a form submit

42

Новый window.fetch API является экологически чистым для замены XMLHttpRequest, что делает использование ES6 обещаний.Там хорошее объяснение here, но она сводится к (из статьи):

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

Browser support теперь хорошо в последних версиях (работает в Chrome, Firefox, Край (V14), Safari (v10.1) , Opera, Safari iOS (v10.3), браузер Android и Chrome для Android), однако IE, скорее всего, не получит официальную поддержку. GitHub has a polyfill, который рекомендуется для поддержки старых браузеров, которые в значительной степени используются (версии esp Safari до марта 2017 года и мобильные браузеры того же периода).

Я думаю, что это более удобно, чем jQuery или XMLHttpRequest или не зависит от характера проекта.

Вот ссылка на спецификации https://fetch.spec.whatwg.org/

Edit:

Использование ES7 асинхронной/Await, это становится просто (на основе this Gist):

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

Одно из решений поддерживает старые браузеры :

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

Может быть, немного перехитрить, но вы определенно поправитесь с этим кодом.

Использование:

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

Вы можете сделать это с чистым 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(); 
} 

См: для более подробной информации: html5rocks tutorial

4

Короткий и чистый:

const http = new XMLHttpRequest() 
 

 
http.open("GET", "https://api.lyrics.ovh/v1/shakira/waka-waka") 
 
http.send() 
 

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