Чтобы 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)