2016-02-26 2 views
2

У меня есть строка формата JSON, которую я хочу добавить как параметр, чтобы атаковать сообщение.Преобразование строки формата JSON в реальный объект в Angular

Я пытаюсь сделать reques, когда я делаю запрос, я получаю эту ошибку от моего веб-сервиса:

#0 /opt/assets/WS/ws.php(48): Slim\Slim::handleErrors(8, 'Trying to get p...', '/opt/assets/WS/...', 48, Array) 
#1 [internal function]: {closure}() 
#2 /opt/assets/WS/vendor/slim/slim/Slim/Route.php(468): call_user_func_array(Object(Closure), Array) 
#3 /opt/assets/WS/vendor/slim/slim/Slim/Slim.php(1357): Slim\Route->dispatch() 
#4 /opt/assets/WS/vendor/slim/slim/Slim/Middleware/Flash.php(85): Slim\Slim->call() 
#5 /opt/assets/WS/vendor/slim/slim/Slim/Middleware/MethodOverride.php(92): Slim\Middleware\Flash->call() 
#6 /opt/assets/WS/vendor/slim/slim/Slim/Middleware/PrettyExceptions.php(67): Slim\Middleware\MethodOverride->call() 
#7 /opt/assets/WS/vendor/slim/slim/Slim/Slim.php(1302): Slim\Middleware\PrettyExceptions->call() 
#8 /opt/assets/WS/ws.php(59): Slim\Slim->run() 
#9 {main} 

Это как запрос не содержит реальный объект JSON. Как я могу его преобразовать? Я сделал некоторые трюки, но, похоже, не работает. Вот мой сценарий:

assets.controller('AfegirTipusActiusCtrl', function ($scope, $http){ 

        // Camps formulari text pla 
       /* $scope.nomAtribut = "<input type='text' name='firstname'>"; 
        $scope.mida = "<input type='number' name='firstname'>"; 
        $scope.obligatori = "<input type='checkbox' name='vehicle' value='yes'>"; */ 

        // Construeix combo 
        $http.get('http://10.0.203.73/WS/ws.php/getCombo/1').success(function(data) { 
         $scope.options = data; 
        }); 

        $scope.atributs = []; 

        $scope.addRow = function(){ 
         var newRow = { 
          nomAtribut: "", 
          tipus: "", 
          mida: "", 
          prioritat: "", 
          obligatori: "", 
          observacions: "" 
         } 
         $scope.atributs.push(newRow); 
        } 

        /* $scope.addField = function() { 
         $scope.atributs.push(newRow); 
        };*/ 

        $scope.prioritat = $scope.atributs.length; 

        // Envia atributs a WS 
        $scope.sendRow = function(){ 
         var d = "{'nomAtribut': 'marca','tipus': 'String','mida': '15','prioritat': '1','obligatori': 'No'}"; 
         $http.post("http://10.0.203.73/WS/ws.php/tipusactius/alta", angular.toJson(d)).success(function(data){ 
          $scope.status = data; 
         }) 
        } 
      }); 

Edit:

Также я добавляю Стройный функцию PHP, которая синтаксического анализа запроса:

$app->post('/tipusactius/alta', function() use ($app) { 
     $json = $app->request->getBody(); 
     header("Content-Type: application/json"); 
     $json_decode = json_decode($json); // $json_decode conte l'bjecte format a partir del json del request 
     echo $json_decode->{'tipus'}; 

    // $sql = "INSERt INTO atributs_actiu (nomAtribut, midaAtribut, tipus_actius_idtipus_actius, atributObligatori, ordre, tipusAtributs_idTipus, observacions 
    //     , combo_idcombo, combo_codi) values ('".$json_decode->{'nomAtribut'}."', '".$json_decode->{'mida'}."', 1, '0', 1, 1, 'atribut de prova', 1, 1)"; 
     $sql = "INSERt INTO atributs_actiu (nomAtribut, midaAtribut, tipus_actius_idtipus_actius, atributObligatori, ordre, tipusAtributs_idTipus, observacions 
         , combo_idcombo, combo_codi) values ('".$json_decode->{'nomAtribut'}."', '3', 1, '0', 1, 1, 'atribut de prova', 1, 1)"; 

     $mysqli=getDB(); 
     $result = $mysqli->query($sql); 
}); 

Solved: Как @vidriduch сказал:

$scope.sendRow = function() { 
    var d = { 
     'nomAtribut': 'marca', 
     'tipus': 'String', 
     'mida': '15', 
     'prioritat': '1', 
     'obligatori': 'No' 
    }; 

    $http.post("http://10.0.203.73/WS/ws.php/tipusactius/alta", angular.toJson(d)).success(function(data) { 
     $scope.status = data; 
})}; 
+0

Используйте 'JSON.parse (d)'. – cl3m

+0

Вы используете 'angular.toJson' на строке. Вы не имеете в виду 'angular.fromJson'? –

+0

angular.toJSON аналогичен JSON.stringify, поэтому d должен быть объектом не строки -> var d = {'nomAtribut': 'marca', 'tipus': 'String', 'mida': '15', ' 'prioritat': '1', 'obligatori': 'No'}; https://docs.angularjs.org/api/ng/function/angular.toJson – vidriduch

ответ

2

angular.toJson Сериализует ввод в строку JSON формате

https://docs.angularjs.org/api/ng/function/angular.toJson

в ваш случай вы сериализуете строку ...

ваш c ode может выглядеть так:

$scope.sendRow = function() { 
    var d = { 
     'nomAtribut': 'marca', 
     'tipus': 'String', 
     'mida': '15', 
     'prioritat': '1', 
     'obligatori': 'No' 
    }; 

    $http.post("http://10.0.203.73/WS/ws.php/tipusactius/alta", angular.toJson(d)).success(function(data) { 
     $scope.status = data; 
})}; 
+1

да, это работает сейчас. Спасибо. – proktovief

1

Если вы хотите, чтобы преобразовать строку JSON в JavaScript объект, вы должны использовать angular.fromJson()method.

Кроме того, убедитесь, чтобы конвертировать ваши одиночные кавычки ' в двойные кавычки " в вашем JSON:

// ' becomes " in your string 
var d = '{"nomAtribut": "marca","tipus": "String","mida": "15","prioritat": "1","obligatori": "No"}'; 

$http.post("http://10.0.203.73/WS/ws.php/tipusactius/alta", angular.fromJson(d)) 
.success(function(data){ 
    $scope.status = data; 
} 
+0

Зачем преобразовывать его в объект, а затем обратно в строку? –

+1

Спасибо, неправильно скопируйте/вставьте. Исправлена! – cl3m

+0

@MattLishman Я пробовал свой ответ, и он не работает. Я получаю такую ​​же ошибку от веб-службы. – proktovief

0

Убедитесь, что аргумент JSON не заблокирован произвольной ссылкой.

Назначение строки JSON переменной и ее передача напрямую будут работать здесь.