我对AngularJS上的$ https.post参数有问题。我读到AngularJS正在为params创建一个JSON。 所以我应用了这里找到的解决方案:
AngularJS - Any way for $http.post to send request parameters instead of JSON?
http://victorblog.com/2012/12/20/make-angularjs-http-service-behave-like-jquery-ajax/
但我仍然遇到Python CGI的问题。
[编辑]
为objData:
输出console.logObject {hostname: "test", id_venue: 20}
检查请求有效负载:
action: "insert",
objData: { first: "test", second:"test2" }
[/编辑]
网站电话
angular.module('myApp.services', [])
.service('MyService', ['$http', '$q', function ($http, $q) {
this.insert = function (objData){
console.log(objData);
var deferred = $q.defer();
$http.post('api/api.py', { action: 'insert', objData: objData }).success(function (data, status, headers, config) {
deferred.resolve(data);
}).error(function (response) {
deferred.reject("error");
});
return deferred.promise;
};
}])
服务器端代码由Python和CGI构成。不幸的是,我不能使用Web框架。
API / api.py
import cgi
params = cgi.FieldStorage()
print 'Content-type: application/json'
print
print params
print params['objData'].value
检查请求标头和响应,我显然有一个KeyError:
FieldStorage(None, None, [MiniFieldStorage('action', 'insert'), MiniFieldStorage('objData[first]', 'test'), MiniFieldStorage('objData[second]', 'test2')])
KeyError: 'objData'
有关如何在Python CGI FieldStorage上正确读取params的任何解决方案。 或者使用AngularJS正确发送它们的任何方式? 使用$ http.get我没有任何问题。
也许一个解决方案可以直接在Python中处理POST请求而不使用cgi.FieldStorage。
答案 0 :(得分:0)
据我所知,在js方面,objData似乎包含{“first”:“test”,“second”:“test2”}。
作为第一个建议,我建议通过在js客户端上使用objData键作为POST键来使你的生活变得更轻松(我假设objData键不以下划线开头,所以在在服务器端,你可以在action和obj键之间做出改变):
params = {_action:'insert'};
_.extend(params, objData); // using underscore or lodash
[...]
$http.post('api/api.py', params)
潜在的问题是你的插入函数非常通用,objData可以是任何东西(所以除了js dictionnary之外),我的第二个建议是首先将你的objData序列化为json字符串(你可以找到js libs for这个),然后发送{action:'insert','jsondata':json_string}。 在python方面,你将不得不反序列化json_string,使用json模块非常容易。
因此,你可以使用经典的POST(< - >不是完整的json编码的表单数据)和一些json的东西。
HTH