2014-01-10 2 views
0

У меня проблема с параметрами $ https.post на AngularJS. Я читал, что AngularJS создает 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.

[Редактировать]

Вывод console.log для objData:

Object {hostname: "test", id_venue: 20} 

осмотр Запрос Payload:

action: "insert", 
objData: { first: "test", second:"test2" } 

[/ Edit]

Обращение к сайту

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.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' 

Любое решение о том, как правильно читать Params на Python CGI FieldStorage. Или любой способ отправить их с помощью AngularJS? С $ http.get у меня нет никаких проблем.

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

+0

Что содержит objData на стороне js? –

+0

Я отредактировал ответ, чтобы показать значение objData – Nicola

+0

Хорошо, мои ответы были неверными, но, кстати, это не совсем недействительно ответ :) –

ответ

0

Насколько я вижу, на стороне js objData, похоже, содержит {"first": "test", "second": "test2"}.

В качестве 1-й рекомендации я бы рекомендовал упростить вашу жизнь, используя ключи objData в качестве ключей POST, выполнив это так на стороне js-клиента (я предполагаю, что ключи objData не начинаются с подчеркивания, так что на стороне сервера, вы можете сделать разницу между действием и OBJ ключей):

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

потенциальная проблема заключается в том, что ваша функция вставки весьма общий характер, objData может быть что угодно (так STH иначе, чем Js dictionnary), моя вторая рекомендация состояла в том, чтобы сначала сериализовать вашу objData как строку json (вы можете найти js libs для этого), а затем отправить {action: 'insert', 'jsondata': json_string}. На стороне python вам придется десериализовать json_string, что очень легко с помощью json-модуля.

Таким образом, вы можете использовать классическую POST (< -> не полную json-кодированную форму данных) и некоторые вещи json.

HTH

+0

О 2-й рекомендации, спасибо, отлично работает. Я не знаю, почему я об этом не думал раньше! О 1-й рекомендации, пожалуйста, уточните? Какая реальная польза? – Nicola

+0

Если вы уверены, что objData - это Javascript dictionnary, первая рекомендация избегает JSON-сериализации на стороне JS и десериализуется на стороне Python, что дает вам несколько микросекунд: p, а другая точка - это «нормальный» POST, тогда как 2nd reco создает некоторую связь между клиентом и сервером (который должен говорить на одном языке). –

Смежные вопросы