Ne pouvez pas spécifier les en-têtes de demande en AngularJS
J'ai 2 pièces dans mon app - Angulaire interface et le serveur rails. Et parce qu'il est différent domaines, les demandes ne fonctionne pas par défaut. Il y a beaucoup de personnel, y compris la pile, mais ça ne fonctionne pas pour moi.
C'est ma méthode angulaire de contrôleur:
$scope.test =->
# transform = (data) ->
# $.param data
$http.post('http://localhost:3000/session/create', 'token=some',
headers:
'Access-Control-Allow-Origin': 'http://localhost:9000',
'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS',
'Access-Control-Allow-Headers': 'Content-Type, X-Requested-With'
# transformRequest: transform
).success (responseData) ->
console.log(responseData)
J'ai fait remarquer que la transformation de données, il n'y a pas de différence dans la réponse du serveur.
Et j'ai configuré l'application (l'a vu dans certains post) comme ça:
.config ["$httpProvider", ($httpProvider) ->
$httpProvider.defaults.useXDomain = true
delete $httpProvider.defaults.headers.common["X-Requested-With"]
]
Je suppose que le fait de demander de ne pas ajax comme (mais je ne suis pas sûr).
Mais il n'y a pas d'en-têtes dans ma demande. Ils sont tous dans un certain domaine Access-Control-Request-Headers:access-control-allow-origin, accept, access-control-allow-headers, access-control-allow-methods, content-type
:
Request URL:http://localhost:3000/session/create
Request Method:OPTIONS
Status Code:404 Not Found
Request Headers
Accept:*/*
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8,ru;q=0.6
Access-Control-Request-Headers:access-control-allow-origin, accept, access-control-allow-headers, access-control-allow-methods, content-type
Access-Control-Request-Method:POST
Connection:keep-alive
DNT:1
Host:localhost:3000
Origin:http://localhost:9000
Referer:http://localhost:9000/
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.8 Safari/537.36
Response Headers
Content-Length:12365
Content-Type:text/html; charset=utf-8
X-Request-Id:2cf4b37b-eb47-432a-ab30-b802b3e33218
X-Runtime:0.030128
Chrome console:
OPTIONS http://localhost:3000/session/create 404 (Not Found) angular.js:6730
OPTIONS http://localhost:3000/session/create No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:9000' is therefore not allowed access. angular.js:6730
XMLHttpRequest cannot load http://localhost:3000/session/create. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:9000' is therefore not allowed access. localhost/:1
Autres négligeable d'informations:
Sur le serveur:
class ApplicationController < ActionController::Base
before_filter :allow_cross_domain_access
protected
def allow_cross_domain_access
headers['Access-Control-Allow-Origin'] = '*'# http://localhost:9000
headers['Access-Control-Allow-Headers'] = 'GET, POST, PUT, DELETE'
headers['Access-Control-Allow-Methods'] = %w{Origin Accept Content-Type X-Requested-With X-CSRF-Token}.join(',')
headers['Access-Control-Max-Age'] = '1728000'
end
end
Routes est évident post "session/create"
. Et la séance de contrôleur:
class SessionController < ApplicationController
respond_to :json, :html, :js
def create
respond_with "logged in"
# render nothing: true
end
end
Je utiliser la dernière version de angulaire 1.2.0.rc-2. c'est mon projet sur github
J'ai généré app avec yeoman angulaires-générateur. Sur la base grunt peut-être il ya certains node.js serveur. Pensez-vous que cela puisse changer mes demandes?
La première demande reçoit une réponse 404. Vous pouvez poster à la sortie de râteau routes? (vous pouvez également vous rendre sur localhost:3000/nonexistent_page dans votre navigateur)
Il ne répond pas aux OPTIONS si, c'est nécessaire pour le contrôle en amont des demandes.
Le frontend est de faire une demande d'OPTIONS (correctement), le serveur répond avec 404 (probablement pas correcte). C'est ce qui m'amène à croire que le serveur est la question.
OriginalL'auteur zishe | 2013-10-08
Vous devez vous connecter pour publier un commentaire.
Vous mélangez la demande et en-têtes de réponse dans votre exemple.
Lorsque vous faites une croix demande de domaine (SCRO) et vous voulez faire quelque chose de différent qu'un simple GET - ainsi, par exemple un POST ou l'ajout d'en-têtes personnalisés - le navigateur va d'abord faire une demande d'OPTIONS.
C'est ce que vous voyez dans votre console développeur:
Ensuite, le serveur doit ajouter les en-têtes de la réponse de la demande OPTIONS.
De sorte que vous pouvez supprimer les en-têtes personnalisés à partir de l'angle d'appel.
Ensuite, vous devez vous assurer que votre serveur/application répond à la demande d'OPTIONS, de ne pas retourner une erreur 404.
$http(method: 'OPTIONS', url: 'http://localhost:3000/session/create').success (responseData) -> console.log(responseData)
et ajouter au parcoursoptions "session/create"
et la console affiche maintenantOPTIONS http://localhost:3000/session/create 500 (Internal Server Error)
et le même suivant les lignes.Oui, vous avez raison, j'ai supprimer les lignes d'en-tête, et cela fonctionne maintenant. Je suppose que avant il y a un problème sur les rails de côté, et ne fonctionne pas par d'autres raisons. Merci.
OriginalL'auteur Thomas