Я пытаюсь позвонить на этот сайт и получить обратно объект json. Как я могу правильно взаимодействовать с этим API в моем chrome-расширении, предоставляемом CSP?
Ошибка: отказался загрузить сценарий " http://thesaurus.altervista.org/service.php?word=smile&language=en_US&output=json&key=REMOVEDMYKEY&callback=thesaurus ", поскольку он нарушает следующую директиву политики безопасности контента: "script-src" self 'chrome-extension-resource: ".
var word = "smile";
var s = document.createElement("script");
s.src = "http://thesaurus.altervista.org/service.php?word="+ word +"&language=en_US&output=json&key=REMOVEDMYKEY&callback=thesaurus";
document.getElementsByTagName("head")[0].appendChild(s);
function thesaurus(result) {
output = "";
for (key in result.response) {
list = result.response[key].list;
output += list.synonyms+"<br>";
}
if (output)
document.getElementById("synonyms").innerHTML = output;
}
В указанном вами URL-адресе явно говорится, что он может вернуть объект JSON. Обратный вызов (стиль JSONP) является необязательным.
Вы не можете использовать JSONP из этого домена из-за политики безопасности содержимого Chrome для расширений. Хотя вы можете добавлять домены с белыми списками в политику, причины HTTP запрещены по соображениям безопасности.
Вместо этого вы хотите записать ответ JSON в виде строки и проанализировать его.
Вам нужно сделать XHR-вызов для этого URL-адреса:
function thesaurus(word) {
var xhr = new XMLHttpRequest();
xhr.onload = function() {
try {
var result = JSON.parse(this.responseText);
// Do something with the result
} catch(e) {
// Invalid JSON response
}
}
xhr.onerror = function(e) {
// Something bad happened
}
xhr.open(
"GET",
"http://thesaurus.altervista.org/service.php?word=" + word +
"&language=en_US&output=json&key=REMOVEDMYKEY",
true
);
xhr.send();
}
И для этого вам могут потребоваться разрешения хоста в вашем манифестах, если только этот сервер не включил CORS из любого источника (что, кстати, имело бы смысл для такого API).
"permissions": [
"*://thesaurus.altervista.org/*"
],
Убедитесь, что ваш скрипт объявляет требуемые разрешения, как описано здесь: https://developer.chrome.com/extensions/xhr#requesting-permission
https://developer.chrome.com/apps/app_external#external
Внутри вашего манифеста должно быть что-то вроде:
"permissions": [
"*http://thesaurus.altervista.org/*"
],