Je suis novice en angular.js, et j'essaye d'ajouter quelques en-têtes à une requête:
var config = {headers: {
'Authorization': 'Basic d2VudHdvcnRobWFuOkNoYW5nZV9tZQ==',
'Accept': 'application/json;odata=verbose'
}
};
$http.get('https://www.example.com/ApplicationData.svc/Malls(1)/Retailers', config).success(successCallback).error(errorCallback);
J'ai regardé toute la documentation, et cela me semble que cela devrait être correct.
Lorsque j'utilise un fichier local pour l'URL dans le $http.get
, je vois la requête HTTP suivante sur l'onglet réseau dans Chrome:
GET /app/data/offers.json HTTP/1.1
Host: www.example.com
Connection: keep-alive
Cache-Control: max-age=0
If-None-Match: "0f0abc9026855b5938797878a03e6889"
Authorization: Basic Y2hhZHN0b25lbWFuOkNoYW5nZV9tZQ==
Accept: application/json;odata=verbose
X-Requested-With: XMLHttpRequest
If-Modified-Since: Sun, 24 Mar 2013 15:58:55 GMT
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22
X-Testing: Testing
Referer: http://www.example.com/app/index.html
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
Comme vous pouvez le voir, les deux en-têtes ont été ajoutés correctement. Mais lorsque je change l'URL pour celle indiquée $http.get
ci - dessus (sauf en utilisant la vraie adresse, pas example.com), alors j'obtiens:
OPTIONS /ApplicationData.svc/Malls(1) HTTP/1.1
Host: www.datahost.net
Connection: keep-alive
Access-Control-Request-Method: GET
Origin: http://mpon.site44.com
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22
Access-Control-Request-Headers: accept, origin, x-requested-with, authorization, x-testing
Accept: */*
Referer: http://mpon.site44.com/app/index.html
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
La seule différence de code entre ces deux est que pour le premier, l'URL est un fichier local et pour le second, l'URL est un serveur distant. Si vous regardez le deuxième en-tête de demande, il n'y a pas d'en-tête d'authentification et Accept
semble utiliser une valeur par défaut au lieu de celle spécifiée. En outre, la première ligne indique maintenant OPTIONS
au lieu de GET
(bien que ce Access-Control-Request-Method
soit GET
).
Une idée de ce qui ne va pas avec le code ci-dessus, ou comment obtenir les en-têtes supplémentaires inclus en utilisant lorsque vous n'utilisez pas un fichier local comme source de données?
la source
Réponses:
J'ai pris ce que tu avais et j'ai ajouté un autre en-
X-Testing
têteEt dans l'onglet Réseau Chrome, je les vois être envoyés.
Ne les voyez-vous pas depuis le navigateur ou sur le serveur? Essayez les outils du navigateur ou un proxy de débogage et voyez ce qui est envoyé.
la source
Authentification de base à l'aide de la méthode HTTP POST:
... et appel de méthode GET avec en-tête:
la source
Si vous souhaitez ajouter vos en-têtes personnalisés à TOUTES les demandes, vous pouvez modifier les valeurs par défaut sur $ httpProvider pour toujours ajouter cet en-tête…
la source
ma suggestion sera d'ajouter un paramètre d'appel de fonction comme celui-ci à l'intérieur de la fonction, vérifiez l'en-tête qui lui convient. Je suis sûr que cela fonctionnera certainement. cela fonctionne parfaitement pour moi.
puis appelez vos données comme ceci
la source
Ce que vous voyez pour la demande OPTIONS est correct. Les en-têtes d'autorisation n'y sont pas exposés.
Mais pour que l'authentification de base fonctionne, vous devez ajouter:
withCredentials = true;
à votre fichiervar config
.À partir de la documentation AngularJS $ http :
la source
Et quelle est la réponse du serveur? Il devrait répondre un 204 et ensuite vraiment envoyer le GET que vous demandez.
Dans les OPTIONS, le client vérifie si le serveur autorise les requêtes CORS. Si cela vous donne quelque chose de différent d'un 204, vous devez configurer votre serveur pour envoyer les en-têtes Allow-Origin corrects.
La façon dont vous ajoutez des en-têtes est la bonne façon de le faire.
la source
Chrome effectue le contrôle en amont de la demande de recherche des en-têtes CORS. Si la demande est acceptable, elle enverra alors la vraie demande. Si vous faites ce cross-domain, vous devrez simplement vous en occuper ou bien trouver un moyen de rendre la requête non-cross-domain. C'est par conception.
Réf: AJAX dans Chrome envoi OPTIONS au lieu de GET / POST / PUT / DELETE?
la source
Pour moi, l'extrait explicatif suivant a fonctionné. Peut-être que vous ne devriez pas utiliser
'
pour le nom d'en-tête?J'utilise
$http.ajax()
, même si je ne m'attendrais pas à ce que cela change la donne.la source