JavaScript - json using curl [duplicate]

Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:

  1. Вызов метода экземпляра объекта null.
  2. Доступ или изменение поля объекта null.
  3. Принимая длину null, как если бы это был массив.
  4. Доступ или изменение слотов null, как если бы это был массив.
  5. Бросок null как будто это было значение Throwable.

Приложения должны бросать экземпляры этого класса, чтобы указать на другие незаконные использования объекта null.

Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html

638
задан Peter Mortensen 27 January 2014 в 15:50
поделиться

25 ответов

Вы можете использовать функции, предоставляемые средой хостинга, через 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);
}

Примечание. Начиная с Gecko 30.0 (Firefox 30.0 / Thunderbird 30.0 / SeaMonkey 2.27), синхронные запросы в основном потоке устарели из-за негативных последствий для пользователя.

997
ответ дан Félix Gagnon-Grenier 18 August 2018 в 22:36
поделиться
  • 1
    Ну, конечно, Javascript имеет встроенный модуль, или как может любая библиотека Javascript предлагать удобный метод для этого? Разница заключается в том, что удобные методы предлагают, а также удобство и более четкий и простой синтаксис. – Pistos 26 June 2014 в 20:53
  • 2
    Почему префикс XML? – AlikElzin-kilaka 29 June 2014 в 19:13
  • 3
    Для асинхронного решения без библиотек см. Ответ tggagne ниже. – mb21 29 August 2014 в 15:32
  • 4
    XML, потому что он использует X из AJAX ~ асинхронного JavaScript и XML . Кроме того, хорошая точка re API , которая имеет и привязку ECMAScript ", связано с тем, что JavaScript может быть во многих вещах, кроме браузеров, поддерживающих HTTP (например, как Adobe Reader ...) Хорошо помнить о том, что шлемы для PointedEars. – will 5 September 2014 в 05:29
  • 5
    @ AlikElzin-kilaka На самом деле все вышеперечисленные ответы не соответствуют значению (infact, связанные с документами W3 объясняют «каждый компонент этого имени потенциально вводит в заблуждение»). Правильный ответ? его просто плохо назвали stackoverflow.com/questions/12067185/… – Ashley Coolman 28 May 2016 в 11:58
  • 6

Для этого API-интерфейс Fetch - рекомендуемый подход, используя JavaScript Promises. XMLHttpRequest (XHR), объекты IFrame или динамические теги являются более старыми (и clunkier) подходами.

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

Вот отличная демонстрация fetch demo и MDN

1
ответ дан aabiro 18 August 2018 в 22:36
поделиться

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

4
ответ дан Andrew Hedges 18 August 2018 в 22:36
поделиться

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

var i = document.createElement("img");
i.src = "/your/GET/url?params=here";
82
ответ дан aNieto2k 18 August 2018 в 22:36
поделиться
  • 1
    это работает во всех браузерах? – dev_musings 27 October 2011 в 02:06
  • 2
    это тоже работает с текстом? – knutole 21 January 2013 в 04:24
  • 3
    Отлично! Мне нужен сценарий Greasemonkey, чтобы сохранить сеанс живым, и этот фрагмент идеален. Просто заверните его в вызов setInterval. – Carcamano 20 October 2016 в 14:33
  • 4
    как получить результат? – user4421975 16 November 2016 в 18:19

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

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

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

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

15
ответ дан Arend 18 August 2018 в 22:36
поделиться
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 как форма submit

3
ответ дан Community 18 August 2018 в 22:36
поделиться

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

const http = new XMLHttpRequest()

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

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

13
ответ дан Damjan Pavlica 18 August 2018 в 22:36
поделиться

Готовая версия для копирования-пасты

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);
27
ответ дан Daniel De León 18 August 2018 в 22:36
поделиться

Много замечательных советов выше, но не очень многократно используемых и слишком часто заполненных глупостью 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
});
122
ответ дан Ekevoo 18 August 2018 в 22:36
поделиться
  • 1
    Похоже, эта проблема была рассмотрена в более позднем редакции. – Craig S. Anderson 9 December 2015 в 02:34
  • 2
    Ошибка UnCaughtReference, HttpClient не определен. Я получаю эту первую строчку. – sashikanta 10 January 2017 в 14:17
  • 3
    Как вы это называете из html onClick? – Gobliins 18 January 2017 в 11:39
  • 4
    Сделайте функцию else, где содержится клиент var ... и просто запустите functionName (); return false; в onClick – mail929 4 February 2017 в 21:48
  • 5
    ReferenceError: XMLHttpRequest is not defined – Bugs Buggy 5 July 2017 в 19:48

Одно решение, поддерживающее более старые браузеры:

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

Возможно, немного перебор, но вы определенно будете в безопасности с этим кодом.

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

//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();
1
ответ дан flyingPotat0 18 August 2018 в 22:36
поделиться
  • 1
    Могут ли люди, пожалуйста, дать некоторые комментарии о том, что я сделал неправильно? Не очень полезно в этом направлении! – flyingPotat0 15 October 2016 в 14:04
  • 2
    Лучший ответ, на мой взгляд, если он кодируется в ES5, используя простой javascript. – CoderX 9 August 2017 в 14:26

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

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

3
ответ дан kiamlaluno 18 August 2018 в 22:36
поделиться

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

0
ответ дан Kondal 18 August 2018 в 22:36
поделиться

Прототип делает его мертвым простым

new Ajax.Request( '/myurl', {
  method:  'get',
  parameters:  { 'param1': 'value1'},
  onSuccess:  function(response){
    alert(response.responseText);
  },
  onFailure:  function(){
    alert('ERROR');
  }
});
11
ответ дан Mark Biek 18 August 2018 в 22:36
поделиться
  • 1
    Проблема в том, что Mac OS X не поставляется с предустановленным прототипом. Поскольку виджет должен запускаться на любом компьютере, в том числе Prototype (или jQuery) в каждом виджете, это не лучшее решение. – kiamlaluno 7 August 2010 в 06:05
  • 2
    @kiamlaluno использовать прототип cdn от cloudflare – Vladimir Stazhilov 14 February 2017 в 11:34

Чтобы обновить лучший ответ от joann с обещанием, это мой код:

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
ответ дан negstek 18 August 2018 в 22:36
поделиться

В jQuery :

$.get(
    "somepage.php",
    {paramOne : 1, paramX : 'abc'},
    function(data) {
       alert('page content: ' + data);
    }
);
174
ответ дан nickf 18 August 2018 в 22:36
поделиться
  • 1
    обратите внимание, что это не работает в IE 10 при попытке доступа к URL-адресу в другом домене, чем домен страницы – BornToCode 30 September 2013 в 10:35
  • 2
    @BornToCode вы должны исследовать дальше и, возможно, открыть ошибку в jQuery-трекере в этом случае – ashes999 8 October 2013 в 17:58
  • 3
    Я знаю, что некоторые люди хотят писать чистый Javascript. Я понимаю. У меня нет проблем с людьми, которые делают это в своих проектах. Мой & quot; В jQuery: & quot; должен быть задуман как «Я знаю, что вы спросили, как это сделать в Javascript, но позвольте мне показать вам, как вы это сделаете с помощью jQuery, чтобы вы могли любопытствовать, видя, какую синтаксическую лаконичность и ясность вы можете наслаждаться используя эту библиотеку, которая предоставит вам множество других преимуществ и инструментов ». – Pistos 26 June 2014 в 20:47
  • 4
    Обратите также внимание на то, что оригинальный плакат позже сказал: «Спасибо за все ответы! Я пошел с jQuery на основе некоторых вещей, которые я читал на их сайте. & Quot ;. – Pistos 26 June 2014 в 20:49

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

3
ответ дан Nikola Stjelja 18 August 2018 в 22:36
поделиться

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

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

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

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

Вот ссылка на spec https://fetch.spec.whatwg.org/

Редактирование:

Использование ES7 async / await, это просто (на основе этот Gist ):

async function fetchAsync (url) {
  let response = await fetch(url);
  let data = await response.json();
  return data;
}
58
ответ дан Peter Gibson 18 August 2018 в 22:36
поделиться
  • 1
    Я могу кого-то сэкономить, указав, что вы можете сделать это, чтобы включить учетные данные в запрос: fetch(url, { credentials:"include" }) – Enselic 9 March 2017 в 12:01
  • 2
    Кроме того, это не позволяет вам получить XML ... – bugmenot123 16 August 2017 в 12:28
  • 3
    @ bugmenot123 window.fetch не поставляется с парсером XML, но вы можете самостоятельно проанализировать ответ, если вы обрабатываете его как текст (а не json, как в примере выше). См. stackoverflow.com/a/37702056/66349 для примера – Peter Gibson 16 August 2017 в 22:56

Ajax

Лучше всего использовать библиотеку, например Prototype или jQuery .

7
ответ дан Peter Mortensen 18 August 2018 в 22:36
поделиться

Вот код, который нужно сделать непосредственно с 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;
        }                    
    }
}
68
ответ дан rp. 18 August 2018 в 22:36
поделиться
  • 1
    Поскольку этот ответ является одним из лучших результатов для googling «HTTP-запрос javascript», стоит упомянуть, что запуск eval по данным ответа, подобный этому, считается плохой практикой – Kloar 19 May 2014 в 10:47
  • 2
    @Kloar хороший момент, но было бы еще лучше дать причину, почему это плохо, что, я думаю, это безопасность. Объяснение, почему практика является плохим, - лучший способ заставить людей переключать свои привычки. – Balmipour 16 September 2015 в 11:16

Для тех, кто использует 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.
  });
4
ответ дан Vitalii Fedorenko 18 August 2018 в 22:36
поделиться

Также может оказаться очень полезным попробовать 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;
    });
1
ответ дан Yoni 18 August 2018 в 22:36
поделиться
3
ответ дан kiamlaluno 7 September 2018 в 06:11
поделиться
7
ответ дан Peter Mortensen 7 September 2018 в 06:11
поделиться
4
ответ дан kiamlaluno 30 October 2018 в 10:20
поделиться
8
ответ дан Peter Mortensen 30 October 2018 в 10:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: