使用数据有效负载对象时,AngularJS POST失败,没有'Access-Control-Allow-Origin',但使用查询参数如有效负载工作

时间:2014-09-28 07:36:33

标签: angularjs http-post

我面临一个奇怪的问题。我在本地的nodejs服务器上运行我的angularjs应用程序,它从位于Google App Engine上的应用程序调用POST API。 API配置了所需的所有CORS头,如下所示:

def post(self):
self.response.headers.add_header("Access-Control-Allow-Origin", "*")
self.response.headers.add_header("Access-Control-Allow-Methods", "POST,GET,PUT,DELETE,OPTIONS")
self.response.headers.add_header("Access-Control-Allow-Headers", "X-Requested-With, content-type, accept, myapp-domain")
self.response.headers["Content-Type"] = “application/json; charset=utf-8”

GET请求API工作没有问题。

POST请求API工作但当我发送帖子数据作为'字符串'当发布数据作为对象发送时, NOT 是正确的方法。最终我需要能够使用此API上传图片,因此下面的第一个解决方案可能对我不起作用。请帮忙!

方法1:此方法有效:

postMessageAPI = "https://myapp-qa.appspot.com/message";

var postData = "conversationid=1c34b4f2&userid=67e80bf6&content='Hello champs! - Web App'";

var postConfig = {
    headers:  {
    "MYAPP-DOMAIN" : "myapp.bz",
    'Content-Type': 'application/json; charset=UTF-8'
    }
};

$http.post(postMessageAPI, postData, postConfig).
success(function(data){
     $log.log("POST Message API success");
}).
error(function(data, status) {
    $log.error("POST Message API FAILED. Status: "+status);
    $log.error(JSON.stringify(postData));
});

方法2:失败:

postMessageAPI = "https://myapp-qa.appspot.com/message";

var postData = ({
    'conversationid' : '1c34b4f2',
    'userid' : '67e80bf6',
    'content' : 'Hello champs! - Web App'
});

var postConfig = {
    headers:  {
    "MYAPP-DOMAIN" : "myapp.bz"
    'Content-Type': 'application/json; charset=UTF-8'
    }
};

$http.post(postMessageAPI, postData, postConfig).
success(function(data){
     $log.log("POST Message API success");
}).
error(function(data, status) {
    $log.error("POST Message API FAILED. Status: "+status);
    $log.error(JSON.stringify(postData));
});

当我使用方法2 时,它在控制台中失败并出现以下错误:

XMLHttpRequest cannot load https://myapp-qa.appspot.com/message. 
No 'Access-Control-Allow-Origin' header is present on the requested resource. 
Origin 'http://0.0.0.0:8000' is therefore not allowed access. 

如果您有任何解决方案,请告诉我。提前谢谢。

1 个答案:

答案 0 :(得分:0)

最有可能的问题是Angular发送了一个飞行前OPTIONS请求来检查服务器的访问标头。我不确定如何在您的API中处理OPTIONS请求,但我打赌这些标头没有被添加。我建议安装Fiddler来监控实际请求以查看标头的内容。您只能将其添加到POST回复中。

有关 METHOD 1 在此方案中可能起作用的详细信息,请参阅this答案,而方法2 则不然。

Here是有关飞行前请求的更多详细信息。