Sou um novato no angular.js e estou tentando adicionar alguns cabeçalhos a uma solicitação:
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);
Eu olhei toda a documentação, e isso me parece que deveria estar correto.
Quando eu uso um arquivo local para o URL no $http.get
, vejo a seguinte solicitação HTTP na guia de rede no 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
Como você pode ver, os dois cabeçalhos foram adicionados corretamente. Mas quando eu mudo o URL para aquele mostrado $http.get
acima (exceto usando o endereço real, não example.com), então obtenho:
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
A única diferença de código entre os dois é que, para o primeiro, o URL é um arquivo local e, para o segundo, o URL é um servidor remoto. Se você olhar o segundo cabeçalho de Solicitação, não há cabeçalho de Autenticação e o Accept
parece estar usando um padrão em vez do especificado. Além disso, a primeira linha agora diz em OPTIONS
vez de GET
(embora Access-Control-Request-Method
seja GET
).
Alguma ideia do que há de errado com o código acima, ou como obter os cabeçalhos adicionais incluídos usando quando não estiver usando um arquivo local como fonte de dados?
fonte
Respostas:
Peguei o que você tinha e adicionei outro
X-Testing
cabeçalhoE na guia da rede do Chrome, eu os vejo sendo enviados.
Você não os está vendo no navegador ou no servidor? Experimente as ferramentas do navegador ou um proxy de depuração e veja o que está sendo enviado.
fonte
Autenticação básica usando o método HTTP POST:
... e chamada de método GET com cabeçalho:
fonte
Se você quiser adicionar seus cabeçalhos personalizados a TODAS as solicitações, você pode alterar os padrões em $ httpProvider para sempre adicionar este cabeçalho ...
fonte
minha sugestão será adicionar uma configuração de chamada de função como esta dentro da função verificar o cabeçalho que é apropriado para ela. Tenho certeza que definitivamente funcionará. está funcionando perfeitamente para mim.
então chame seus dados assim
fonte
O que você vê para a solicitação de OPÇÕES está bom. Os cabeçalhos de autorização não são expostos nele.
Mas para que a autenticação básica funcione, você precisa adicionar:
withCredentials = true;
ao seuvar config
.Da documentação $ http do AngularJS :
fonte
E qual é a resposta do servidor? Ele deve responder um 204 e então realmente enviar o GET que você está solicitando.
Em OPÇÕES o cliente está verificando se o servidor permite solicitações CORS. Se ele fornecer algo diferente de 204, você deve configurar seu servidor para enviar os cabeçalhos Allow-Origin corretos.
A maneira como você adiciona cabeçalhos é a maneira certa de fazer isso.
fonte
O Chrome está testando a solicitação para procurar cabeçalhos CORS. Se a solicitação for aceitável, ele enviará a solicitação real. Se estiver fazendo isso entre domínios, você simplesmente terá que lidar com isso ou então encontrar uma maneira de tornar a solicitação não entre domínios. Isso ocorre por design.
Ref: AJAX no Chrome enviando OPÇÕES em vez de GET / POST / PUT / DELETE?
fonte
Para mim, o seguinte fragmento explicativo funcionou. Talvez você não deva usar
'
para o nome do cabeçalho?Estou usando
$http.ajax()
, embora não espere que isso mude o jogo.fonte