2013-09-16 53 views
2

我硬是在網上淘想辦法找到後我的數據,以正確的方法服務器使用AngularJS。

當我用Angular JS做了一個$ http POST請求時,它將我的數據發佈到服務器,但失敗並顯示錯誤消息「Origin http://localhost:8000不被Access-Control-Allow-Origin允許」,如果我嘗試它以「文件:///」,結果還是一樣。

我想互聯網上提到的所有補救措施,包括

app.config(['$httpProvider', function ($httpProvider) { 
      $httpProvider.defaults.useXDomain = true; 
      delete $httpProvider.defaults.headers.common['X-Requested-With']; 
     }]); 

,跟着大多數指令在此article 但他們沒有爲我工作。

我還設置服務器端方法Access-Control-Allow-Origin: *access-control-allow-headers: Origin, X-Requested-With, Content-Type, Accept, access_token, Origin, X-Requested-With, Content-Type, Accept, access_token,但我仍然得到同樣的錯誤,下面是我的代碼

var URL = "https://myURL"; 
     var app = angular.module('myApp', []); 
     app.config(['$httpProvider', function ($httpProvider) { 
      $httpProvider.defaults.useXDomain = true; 
      delete $httpProvider.defaults.headers.common['X-Requested-With']; 
     }]); 
     app.controller('UserController', function($scope, $http){ 
      $scope.user = {}; 
      $scope.createUser = function() { 
       $http({ 
        url: URL, 
        data: $scope.user, 
        method: "POST", 
        headers: { 
         "Content-Type": "application/json", 
         "access_token": "sometoken" 
        } 
       }).success(function(response){ 
          $scope.response = response; 
          alert('ok'); 
         }).error(function(error){ 
          $scope.error = error; 
          alert('error'); 
         }); 
      } 
     }); 

我不知道我做錯了,請幫助我。

編輯:

以下是我的預檢頭

Request URL:https://myURL 
Request Method:OPTIONS 
Status Code:200 OK 
Request Headersview source 
:host:someapp.appspot.com 
:method:OPTIONS 
:path:somepath 
:scheme:https 
:version:HTTP/1.1 
accept:*/* 
accept-encoding:gzip,deflate,sdch 
accept-language:en-US,en;q=0.8 
access-control-request-headers:accept, origin, access_token, content-type 
access-control-request-method:POST 
dnt:1 
origin:http://localhost:8000 
referer:http://localhost:8000/samplepost.html 
user-agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.66 Safari/537.36 
Response Headersview source 
access-control-allow-headers:Origin, X-Requested-With, Content-Type, Accept, access_token 
access-control-allow-origin:* 
alternate-protocol:443:quic 
content-length:0 
content-type:text/html 
date:Mon, 16 Sep 2013 17:58:03 GMT 
server:Google Frontend 
status:200 OK 
version:HTTP/1.1 

而下面是帖子標題:

Request URL:someURL 
Request Headersview source 
Accept:application/json, text/plain, */* 
access_token:dsfdsfds 
Content-Type:application/json 
Origin:http://localhost:8000 
Referer:http://localhost:8000/samplepost.html 
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.66 Safari/537.36 
Request Payloadview source 
{name:adasds, email:[email protected], phone:325325325, comments:fddsfsdfsd} 
comments: "fddsfsdfsd" 
email: "[email protected]" 
name: "adasds" 
phone: "325325325" 

Firefox的請求頭和響應頭:

Response Headersview 
Access-Control-Allow-Orig... *, * 
Alternate-Protocol 443:quic 
Cache-Control private 
Content-Encoding gzip 
Content-Length 136 
Content-Type application/json 
Date Mon, 16 Sep 2013 18:30:17 GMT 
Server Google Frontend 
Vary Accept-Encoding 
X-Firefox-Spdy 3 
access-control-allow-head... Origin, X-Requested-With, Content-Type, Accept, access_token, Origin, X-Requested-With, Content-Type, Accept, access_token 
Request Headersview source 
Accept application/json, text/plain, */* 
Accept-Encoding gzip, deflate 
Accept-Language en-US,en;q=0.5 
Cache-Control no-cache 
Connection keep-alive 
Content-Length 100 
Content-Type application/json; charset=UTF-8 
Host someapp.appspot.com 
Origin null 
Pragma no-cache 
User-Agent Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0 
access_token dsfdsfds 
+0

服務器返回什麼?你能否驗證預檢是否正常工作,服務器是否在「OPTIONS」響應和「POST」響應中返回了正確的標題? – TheSharpieOne

+1

@TheSharpieOne添加了OPTIONS和POST'S的響應頭,響應ID爲空 –

+0

POST的響應頭將是最有用的。使用Firebug切換到Firefox以查看它。 Chrome有一個錯誤,如果問題出在它不會顯示。 – TheSharpieOne

回答

0

除非你正在發佈到服務器接受AngularJS OPTIONS的請求,也沒有辦法,你可以從你的服務器做一個POST。您需要配置和設置您的服務器才能接受此請求;根據語言,也有可以通過CORS server setup +LANGUAGE發現許多導遊。

一個少爲人知的竅門,一些API的使用是使用JSONP。 AngularJS JSONP調用可以做這樣的:

$http.jsonp('https://api.endpoint.com/post-json?id=ID-KEY&callback=JSON_CALLBACK') 
.success(function(data, status) {... }) 

這也需要從服務器的一些工作,但如果你想消耗第三方,可能是你的選擇。

更新:您的服務器響應頭中可能缺少Access-Control-Allow-Methods:POST, GET, OPTIONS, PUT, DELETE

3

我有一個類似的問題。嘗試了我可以在網上看到的所有建議,但都沒有成功。直到我不得不手動設置Content-Typeapplication/x-www-form-urlencoded使POST請求前。

您可以通過這樣做:

$http.defaults.headers.post["Content-Type"] = "application/x-www-form-urlencoded"; 
2

我已經解決了這個: 你正在一個跨源請求,從HTTP到HTTPS。

這在規範中沒有描述,但是您可以在chrome中測試它,這會忽略問題。

您必須堅持所有http或所有https。

祝你好運。

相關問題