Ich kann das nicht spezifizieren-Header in der Anfrage in AngularJS
Habe ich 2 Teile in meiner app - Winkel-frontend und rails server. Und weil es verschiedene domains, Anfragen funktioniert nicht standardmäßig. Es gibt eine Menge von Mitarbeitern über, die, einschließlich stack, aber es funktioniert nicht für mich.
Dies ist meine Methode in eckigen controller:
$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)
Habe ich kommentiert, Daten zu transformieren, es gibt keinen Unterschied in der server-Antwort.
Und ich konfigurierte app (habe das in einigen post) so:
.config ["$httpProvider", ($httpProvider) ->
$httpProvider.defaults.useXDomain = true
delete $httpProvider.defaults.headers.common["X-Requested-With"]
]
Ich denke, das macht die Anfrage nicht ajax-like (bin mir aber nicht sicher).
Aber es gibt keine Header meiner Anfrage. Sie alle, die in irgendeinem Feld 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
Andere unwichtige Informationen:
Auf dem server:
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
Routen ist offensichtlich post "session/create"
. Und session controller:
class SessionController < ApplicationController
respond_to :json, :html, :js
def create
respond_with "logged in"
# render nothing: true
end
end
Ich benutze die Letzte version von Winkel-1.2.0.rc-2. dies ist mein Projekt auf github
- Der Header muss nicht korrekt eingestellt, sind Sie mit einem anderen webserver weiterleiten von Anforderungen an eine rails-app-server?
- Ich generierte app mit yeoman-angular-generator. Es basiert auf grunt vielleicht gibt es einige node.js server. Denken Sie, es kann ändern Sie meine Anforderungen?
- Die erste Anfrage erhält eine 404-Antwort. Kannst du die Ausgabe von rake routes? (alternativ gehen Sie zu localhost:3000/nonexistent_page in Ihrem browser)
- Routen ist in Ordnung - ich änderungen von post-auf get-und
respond_with "logged in"
aufrender nothing: true
, und es zeigt eine leere Seite ohne jegliche Fehler. - Es reagiert nicht auf OPTIONEN aber, dies ist notwendig für die preflight-Anfragen.
- Ich habe hinzuzufügen, bevor Sie es, ändern Sie einfach in der post, nicht geholfen. By the way, ich habe versucht, github.com/cyu/rack-cors dieses Juwel, Gleiches Ergebnis. Die Ausgabe im frontend-Teil, denke ich.
- Dem frontend ist es ein OPTIONS-request (richtig), der server antwortet mit Statuscode 404 (wahrscheinlich nicht korrekt). Das ist, was führt mich zu glauben, dass der server das Problem.
- Vielleicht sollte ich das machen Anfrage zu open api und überprüfen Sie die Reaktion.
- Sie wurden auch richtig, danke für die Hilfe.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mischen Sie, bis die request-und response-Header in Ihrem Beispiel.
Wenn eine cross-domain-Anfrage (CORS) und Sie wollen etwas anderes als ein schlichtes BEKOMMEN - so zum Beispiel von der POST oder benutzerdefinierten Header hinzufügen - der browser wird zuerst ein OPTIONS-request.
Dies ist, was Sie in Ihrer developer console:
Dem server sollte dann fügen Sie die entsprechende überschrift, um die Antwort auf die OPTIONS-Anfrage.
So können Sie entfernen Sie die benutzerdefinierte Kopfzeilen der Winkel nennen.
Als Nächstes müssen Sie sicherstellen, dass Ihr server/Anwendung beantwortet die OPTIONS-Anfrage, - nicht wieder eine 404.
$http(method: 'OPTIONS', url: 'http://localhost:3000/session/create').success (responseData) -> console.log(responseData)
und add zu Routenoptions "session/create"
und die Konsole zeigt nunOPTIONS http://localhost:3000/session/create 500 (Internal Server Error)
und gleich die nächste Zeilen.