我尝试设置一个AngularJS前端,以便在GAE上与Python后端进行通信。我有以下代码:
//Angular factory
app.factory('turn', function($http, $q){
return{
get : function(){
var deferred = $q.defer()
var url = 'save'
$http.get(url).success(function(data){
deferred.resolve(data)
})
return deferred.promise
},
save : function(data){
$http({
method: 'post',
url: 'save',
data: data,
headers:{'Content-type': 'application/json'}
}).success(function(response){
return response
}).error(function(response){
return response
})
}
}//close return
})//close factory
#Python back end
class Data(webapp2.RedirectHandler):
def get(self):
self.response.headers['Content-Type'] = 'application/json'
data = {"success": 'Yes', "payload": "You got it"}
json.dump(data, self.response.out)
def post(self):
logging.info(self.request.get('name'))
data = self.request.get('payload')
data = {'response': data}
logging.info(data)
self.response.headers['Content-Type'] = 'application/json'
json.dump(data, self.response.out)
// Line of code which fires the process and should display the response.
$scope.message = turn.save({name:'Neil', payload: 'payload'}).response
get方面工作正常,但Post在开发服务器上不起作用。
由于我的状态代码为200,当我查看实际消息时(使用Chrome开发工具/网络),消息似乎正确形成,看起来信息是在Headers Request Payload和Response上。
然而,Python后端和Angular前端都无法读取数据。
更新:已经深入挖掘了webapp2文档并提出了这个看起来有点像黑客攻击的解决方案:
def post(self):
data = self.request.POST.items()[0][0]
data = json.loads(data)
data = {'response': data['name']}
self.response.headers['Content-Type'] = 'application/json'
json.dump(data, self.response.out)
出于某种原因,来自Angular的整个Post Json数据作为第一个元组的关键部分进入Webapp2 MultiDict。然后需要将其删除并运行json库以转换为我现在可以使用的字典。
在Angular端对代码进行了一些小的调整,以便控制器现在可以处理结果
工厂现在读取:
save : function(data){
return $http({
method: 'post',
url: 'save',
data: data,
headers:{'Content-Type': 'application/x-www-form-urlencoded'}
})
}
请注意Content-Type中的更改。这是发送到webapp2的数据的首选类型。
控制器呼叫:
turn.save({name:'Neil', payload: 'payload'}).then(function(response){
$scope.message=response.data.response
})
现在正确地将信息发送到后端并向前端发送响应。请注意,我从后端创建和发送的实际Json数据位于response.data。我不得不查看整个响应,找到它的放置位置。
我会放弃这个,因为我确信我不是唯一一个遇到这个问题的人。