Попытка прочитать удаленный URL vis jQuery get JSON jsonp, но это не работает - PullRequest
0 голосов
/ 27 февраля 2020

Я пытаюсь использовать NPPES API .

Мне просто нужно отправить ему такую ​​ссылку https://npiregistry.cms.hhs.gov/api/?number=1801965413&version=2.1 и вернуть результаты в jQuery.

Из того, что я исследовал, потому что мне нужен междоменный домен использовать jsonp, но я не могу заставить это работать.

$.getJSON({
    url: "https://npiregistry.cms.hhs.gov/api/?number=1801965413&version=2.1",
    dataType: "jsonp",
    type: "POST",
    jsonpCallback: 'processJSONPResponse',
    contentType: "application/json; charset=utf-8",
    success: function (result, status, xhr) {
        console.log(result);
    },
    error: function (xhr, status, error) {
        console.log("Result: " + status + " " + error + " " + xhr.status + " " + xhr.statusText)
    }
});

Я получаю следующую ошибку, которую, как я думал, jsonp должен был избежать.

Блокировка перекрестного источника (CORB) заблокировала перекрестный ответ

Результат: parsererror Ошибка: не был вызван processJSONPResponse 200 success

Есть ли способ заставить это работать или любой другой JS способ?

1 Ответ

1 голос
/ 28 февраля 2020

Чтобы JSONP работал, API должен возвращать правильный ответ. Этот API не.

Это как-то связано с тем, как JSONP работает с CORS (ранее я объяснил CORS более подробно здесь ).

Чтобы увидеть, как JSONP работает, скажем, где-то на нашем сайте где-то есть следующий фрагмент кода в виде тега <script>:

processJSONResponse({"some": "json", "from": "wherever"});

этот фрагмент кода вызывает функцию JS processJSONResponse с некоторыми значениями JSON как единственный аргумент. Мы также знаем, что JS может происходить из других источников, например <script src="somewhere.com/some.js"></script>, верно?

Что ж, из-за CORS мы не можем напрямую загрузить JSON из другого источника (в вашем случае API конечная точка), но вполне нормально загружать некоторый код JavaScript откуда-то еще, как мы исследовали выше.

Следовательно, некоторые API имеют режим JSONP, где вместо прямого возврата JSON они вместо этого возвращает ответ типа «text / javascript», и ответ выглядит как сценарий, который я показал далее: он содержит вызов функции, а ответ API - это первый и единственный аргумент, передаваемый в функцию.

Допустим, у нас есть API-интерфейс с поддержкой JSONP по адресу example.com/api, конечная точка может выглядеть как `https://example.com/api?jsonp=helloThere", а ответ будет выглядеть так:

helloThere({"some":"response"});

Вы видите, что API должен ответить с помощью некоторого вызова функции, обертывающего фактический ответ API. Когда API имеет эту опцию, вам нужно только реализовать функцию (здесь это будет helloThere), и вы получите ответ на ваш JavaScript. У jQuery есть помощник для выполнения этих битов (необходимо создать тег <script> с URL-адресом конечной точки, например, атрибутом src.

Указанный вами API не Похоже, что он не поддерживает JSONP. Альтернативой может быть использование прокси-сервера CORS, например , . Вам нужно будет где-то запустить сервер, чтобы он мог добавить заголовки CORS. может тогда получить данные как это:

fetch("https://your-cors-proxy.com/https://npiregistry.cms.hhs.gov/api/?number=1801965413&version=2.1")
.then(response => response.json())
.then(console.log)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...