AngularJS $http.post и Python CGI FieldStorage

Имам проблем с параметрите на $https.post на AngularJS. Четох, че AngularJS създава JSON за параметрите. Така че приложих решението, намерено тук:

https://stackoverflow.com/questions/12190166/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.

[Редактиране]

Изход от console.log за objData:

Object {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. За съжаление не мога да използвам уеб рамки е ограничение.

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. Или някакъв начин да ги изпратите правилно с AngularJS? С $http.get нямам никакъв проблем.

Може би едно решение може да бъде да се обработва POST заявка директно в Python, без да се използва cgi.FieldStorage.


person Nicola    schedule 10.01.2014    source източник
comment
Какво съдържа objData от страна на js?   -  person Raphaël Braud    schedule 10.01.2014
comment
Редактирах отговора, за да покажа стойност objData   -  person Nicola    schedule 10.01.2014
comment
Добре, предположенията ми за отговорите бяха погрешни, но между другото, това не прави отговора напълно невалиден :)   -  person Raphaël Braud    schedule 10.01.2014


Отговори (1)


Доколкото мога да видя, от страна на js objData изглежда съдържа {"first": "test", "second": "test2"}.

Като първа препоръка бих препоръчал да улесните живота си, като използвате objData ключове като POST ключове, като направите sth като това от страната на js клиента (предполагам, че objData ключовете не започват с долна черта, така че от страна на сървъра , можете да направите разлика между клавишите за действие и obj) :

params = {_action:'insert'};
_.extend(params, objData); // using underscore or lodash
[...]
$http.post('api/api.py', params)

Потенциалният проблем е, че вашата функция за вмъкване е доста обща, objData може да бъде всичко (така че sth различно от js речник), втората ми препоръка би била първо да сериализирате objData като json низ (можете да намерите js libs за това), след това изпратете {action: 'insert', 'jsondata': json_string}. От страна на Python ще трябва да десериализирате json_string, което е доста лесно с json модула.

По този начин можете да използвате както класически POST (‹-> не пълни json кодирани данни на формуляр), така и някои json неща.

HTH

person Raphaël Braud    schedule 10.01.2014
comment
Относно втората препоръка, благодаря, работи перфектно. Не знам защо не се сетих за това преди! Относно 1-вата препоръка, бихте ли разяснили, моля? Каква е истинската полза? - person Nicola; 10.01.2014
comment
Ако сте сигурни, че objData е речник на Javascript, 1-ва препоръка избягва JSON-сериализиране от страна на JS и десериализиране от страна на Python, като по този начин ви дава няколко микросекунди :p и друг момент е, че това е нормален POST, докато 2-ро reco създава известно свързване между клиент и сървър (които трябва да говорят един и същи език). - person Raphaël Braud; 11.01.2014