Soy un novato en angular.js y estoy tratando de agregar algunos encabezados a una solicitud:
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);
He mirado toda la documentación y me parece que debería ser correcta.
Cuando utilizo un archivo local para la URL en el $http.get
, veo la siguiente solicitud HTTP en la pestaña de red en 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 puede ver, ambos encabezados se agregaron correctamente. Pero cuando cambio la URL a la que se muestra $http.get
arriba (excepto usando la dirección real, no example.com), obtengo:
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 única diferencia de código entre estos dos es que, para el primero, la URL es un archivo local y, para el segundo, la URL es un servidor remoto. Si observa el segundo encabezado de Solicitud, no hay un encabezado de Autenticación y Accept
parece estar usando un encabezado predeterminado en lugar del especificado. Además, la primera línea ahora dice en OPTIONS
lugar de GET
(aunque Access-Control-Request-Method
es GET
).
¿Alguna idea de lo que está mal con el código anterior, o cómo obtener los encabezados adicionales incluidos cuando no se usa un archivo local como fuente de datos?
fuente
Respuestas:
Tomé lo que tenías y agregué otro
X-Testing
encabezadoY en la pestaña de red de Chrome, veo que se envían.
¿No los ve desde el navegador o en el servidor? Pruebe las herramientas del navegador o un proxy de depuración y vea lo que se envía.
fuente
Autenticación básica mediante el método HTTP POST:
... y llamada al método GET con encabezado:
fuente
Si desea agregar sus encabezados personalizados a TODAS las solicitudes, puede cambiar los valores predeterminados en $ httpProvider para agregar siempre este encabezado ...
fuente
Mi sugerencia será agregar una configuración de llamada de función como esta dentro de la función, verifique el encabezado que sea apropiado para ella. Estoy seguro de que definitivamente funcionará. funciona perfectamente para mí.
luego llama a tus datos así
fuente
Lo que ves para la solicitud de OPCIONES está bien. Los encabezados de autorización no están expuestos en él.
Pero para que la autenticación básica funcione, debe agregar:
withCredentials = true;
a suvar config
.De la documentación de AngularJS $ http :
fuente
¿Y cuál es la respuesta del servidor? Debería responder un 204 y luego enviar realmente el GET que está solicitando.
En las OPCIONES, el cliente está comprobando si el servidor permite solicitudes CORS. Si te da algo diferente a 204, entonces debes configurar tu servidor para enviar los encabezados de Allow-Origin correctos.
La forma en que agrega encabezados es la forma correcta de hacerlo.
fuente
Chrome está realizando una verificación previa de la solicitud para buscar encabezados CORS. Si la solicitud es aceptable, enviará la solicitud real. Si está haciendo este dominio cruzado, simplemente tendrá que lidiar con él o, de lo contrario, encontrará una manera de hacer que la solicitud no sea de dominio cruzado. Esto es por diseño.
Ref: AJAX en Chrome enviando OPCIONES en lugar de GET / POST / PUT / DELETE?
fuente
Para mí, el siguiente fragmento explicativo funcionó. ¿Quizás no debería usar
'
para el nombre del encabezado?Estoy usando
$http.ajax()
, aunque no esperaría que eso cambiara las reglas del juego.fuente