Comment faire une requête POST à l'aide d'AJAX dans une Extension Chrome?
Je suis tenter de faire un appel ajax lorsque le navigateur est sur ma page web, il fonctionne parfaitement, mais dès que je quitte mon domaine, il échoue. C'est pour un système fermé que l'utilisateur sait qu'ils sont suivis donc rien ombragé passe. Je reçois un message d'erreur 406 sur tout ce qui sort de mon domaine. Par exemple, si j'ai sur mon url de www.mywebpage.com le script s'exécute parfaitement, mais dès que je visite www.yourwebpage.com elle renvoie l'erreur.
J'ai essayé la configuration les autorisations dans le manifeste.json à l'adresse de ma page, toutes les url, url, mais il se comporte de la même manière. Voici mon background.js
chrome.runtime.onMessage.addListener
(
function(message, sender, sendResponse)
{
if(message.applicationcode=="VALIDAPPLICATIONKEY")
{
var salt=message.salt;
var learnerid=message.learnerid;
var behaviorkey=message.behaviorkey;
var behaviorname=message.behaviorname;
var behaviorkeyname=message.behaviorkeyname;
chrome.tabs.query
(
{active: true},
function(arrayOfTabs)
{
var data = new FormData();
data.append('Salt', salt);
data.append('LearnerID', learnerid);
data.append('BehaviorKey', behaviorkey);
data.append('BehaviorName', behaviorname);
data.append('BehaviorKeyName', behaviorkeyname);
data.append('BehaviorValue', arrayOfTabs[0].url);
var xhr = new XMLHttpRequest();
xhr.open('POST', 'https://www.mywebpage.com/myservice.php', true);
xhr.onreadystatechange = function()
{
if (xhr.readyState == 4)
{
//JSON.parse does not evaluate the attacker's scripts.
var resp = JSON.parse(xhr.responseText);
console.log(resp);
}
}
xhr.send(data);
}
);//end query
return true;
}
}
);//end listener
Voici mon fichier de manifeste.
{
"manifest_version": 2,
"name": "Application",
"description": "Plugin",
"version": "1.0",
"background":
{
"scripts": ["jquery.js","background.js"],
"persistent": true
},
"permissions": [
"tabs","http://www.mywebpage.com/*","https://www.mywebpage.com/*"
],
"browser_action":
{
"default_icon": "icon.png",
"default_popup": "popup.html"
},
"content_scripts":
[
{
"matches": ["<all_urls>"],
"js": ["jquery.js","popup.js"]
}
]
}
Toute pensée ou de l'aide sur ce serait grandement apprécié. Selon la documentation de ici ce que je suis en train de faire est autorisée par les extensions et ne travaillent dans une manière limitée. Ou si ce type d'action prenant place dans le prolongement de la page comme l'a suggéré ici? Je suis nouveau à l'écriture d'extensions pour Chrome et je suis sûr que je suis absent quelque chose de stupide.
Merci d'avance.
- Votre fichier manifeste est ici crucial.
- D'intérêt, pourquoi avez-vous
return true
dans leonMessage
auditeur? Il raconte Chrome de s'attendre à cesendResponse
être appelée de façon asynchrone, mais il n'arrive pas dans votre extrait de code. - C'était une recommandation de ce link . J'ai été à récurer le Débordement de Pile pour une solution :). Si il n'est pas nécessaire, s'il vous plaît aidez-moi à comprendre pourquoi, par opposition à la réponse de l'autre article. Merci pour le fou de la réponse rapide!
- Dans la réponse que vous avez lié
resp === sendResponse
, doncsendResponse
est en fait appelé. Dans votre code, vous ne l'utilisez pas. - Cela prend tout son sens. J'ai été à l'origine à l'aide de sendResponse mais modifiée à cause de ce problème.
- Modifié pour inclure le fichier de manifeste.
- Faire de l'ajax de fond pas de contenu
- La requête ajax est venue de l'arrière-plan.
Vous devez vous connecter pour publier un commentaire.
Voilà la solution que j'ai eu:
manifeste.json:
background.js:
popup.js:
À partir de ma page web:
Mon problème était là mon premier événement d'appel qui s'est passé, à partir de l'intérieur de la page web....d'où l'erreur 406. Espérons que cela aide quelqu'un d'autre.
Cause:
Heureusement, vous avez raison... vous ne manquait quelque chose de simple:
Vous avez besoin d'autorisations pour CHAQUE page/domaine/adresse URL que vous voulez que cela fonctionne et que vous avez seulement demandé autorisations pour http://www.mywebpage.com dans votre
manifest.json
:Solution:
Si vous voulez le faire dans le contexte de la page d'arrière-plan/script, vous devez ajouter toutes les Url dans le
permissions
entrée dans votremanifest.json
. Si vous voulez le faire à partir d'un contenu du script, alors vous devez l'ajouter dans lacontent_scripts
entrée. Si vous prévoyez de le faire dans les deux endroits, puis ajouter dans les deux entrées/sections:si vous souhaitez également à l'utilisateur d'être en mesure d'utiliser votre extension lors de l'ouverture de fichiers locaux trop, puis ajouter une permission pour le fichier de schéma/protocole, comme suit:
document.location.href
n'a rien à voir avec une quelconque ouvrir la page (c'estchrome-extension://[extension id here]/_generated_background_page.html
pour être précis). Et ces XHR n'avez pas à vous soucier de la croix-domaine, tant qu'il y a de l'hôte des autorisations pour la demande d'adresse. Les OP en fait lié à la la documentation pertinente.