我正在尝试将事件发布到响应 GET/POST 的 CherryPy 小型应用程序中,但是当尝试使用 AngularJS 时,它根本没有发布任何东西。
现在,我不知道这是否与 AngularJS 或 CherryPy(CP)有关,CP 中启用了跨域,但它根本无法获取 POST 方法。然而,这适用于 CURL
CP 中的 POST 定义为:
def POST(self, date, description):
# read items to catch any server side update
events = {
"date": int(date.encode('ascii','ignore')),
"description": description.encode('ascii','ignore'),
"status":"Active"
}
# storing changes
save_events(events)
return ('Event created\n')
header 通过以下方式启用:
def enableCrossDomain():
cherrypy.response.headers["Access-Control-Allow-Origin"] = "*"
cherrypy.response.headers["Access-Control-Allow-Methods"] = "GET, POST"
cherrypy.response.headers["Access-Control-Allow-Headers"] = "Cache-Control, X-Proxy-Authorization, X-Requested-With"
def OPTIONS(self):
enableCrossDomain()
return
CURL 调用如下所示:
curl -d $EPOCH_DATE -d $EVENT -X POST 'myurl.com:1234/api/events/'
用 AngularJS 试试这个:
var message = "'" + $scope.event_description + "' '" + $scope.datetime_start + "'";
console.log(message);
$scope.post_url = "myurl.com:1234/api/events";
$http.post($scope.post_url,message).success();
已经尝试将“消息”作为 JSON 发布并在 header 中指定它,但就是无法正常工作。有什么想法我错过了什么或者我还应该在这里尝试什么吗?
最佳答案
看起来答案很简单:
URL 编码不正确,因此浏览器运行异常;改变了这个:
$scope.post_url = "myurl.com:1234/api/events";
为了
$scope.post_url = "http://myurl.com:1234/api/events";
然后只是错误地解析了消息,我通过以下消息注意到了这一点:
HTTPError: (404, 'Missing parameters: message')
为了简单起见,将参数更改为仅一条消息并在 python 内部将其拆分,然后我的整个 POST 调用更改为:
$scope.post_url = "http://myurl.com:1234/api/events";
var message = 'message=' + $scope.datetime_start + ',' + $scope.event_description;
$http({
method: 'POST',
url: $scope.post_url,
data: message,
headers: {'Content-Type': 'application/x-www-form-urlencoded'}
});
同样重要的是,在 python 端我没有将 header 附加到 POST 消息,更改了以下内容:
def POST(self, date, description):
# read items to catch any server side update
events = {
"date": int(date.encode('ascii','ignore')),
"description": description.encode('ascii','ignore'),
"status":"Active"
}
# storing changes
save_events(events)
return ('Event created\n')
为此:
def POST(self, message):
# read items to catch any server side update
events = {
"date": int(message.split(',')[0].encode('ascii','ignore')),
"description": message.split(',')[1].encode('ascii','ignore'),
"status":"Active"
}
# storing changes
save_events(events)
enableCrossDomain() # HEADERS HERE OR AJAX GETS ANGRY
return ('Event created\n')
关于javascript - AngularJS http.post 与 cherrypy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21464814/