2015-12-08 3 views
0

Я пытаюсь прочитать json с веб-службы.Чтение JSON на AngularJS

Я получаю сообщение об ошибке при попытке прочитать файл формы веб-службы.

enter image description here

Это мой контроллер:

var myApp = angular.module('myApp',[]); 

myApp.controller('ShowServers', function($scope, $http) { 
    $http.get('http://localhost/espaidiscos/WebService/ws.php/servidors'). 
    success(function(data, status, headers, config) { 
     $scope.servers = data; 
     console.log("work"); 
    }). 
    error(function(data, status, headers, config) { 
     // log error 
     console.log("don't work"); 
    }); 
}); 

HTML-:

<html ng-app='myApp'> 
    <header> 
     <script src="./assets/js/angular.min.js"></script> 
    </header> 
    <body> 
     <div ng-controller="ShowServers"> 
      <ul> 
       <li ng-repeat="server in servers"> 
        {{ server.nom }} 
       </li> 
      </ul> 
     </div> 
     <!--<div ng-controller="GreetingController"> 
      {{ greeting }} 
     </div>--> 
    </body> 
    <!--<script src="./assets/js/angular.min.js"></script>--> 
    <script src="./assets/js/controller.js"></script> 
    <!--<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.5.0-beta.2/angular.min.js"></script>--> 
</html> 

Я не могу получить какое-либо значение в браузере. Я очень новичок, любая помощь была бы благодарна.

Edit:

Это то, что я получаю сформировать веб-службы по этому адресу:

{"servers": [{"idServidors":"1","nom":"file01","ip":"10.0.0.170"},{"idServidors":"2","nom":"dc","ip":"10.0.0.5"}]} 

Edit v2:

Я tryied с SoapUI и это то, что мой веб-сервис возвращается me:

<html> 
    <head> 
     <meta content="HTML Tidy for Java (vers. 26 sep 2004), see www.w3.org" name="generator"/> 
     <title/> 
    </head> 
    <body>{"servers": [{"idServidors":"1","nom":"file01","ip":"10.0.0.170"},{"idServidors":"2","nom":"dc","ip":"10.0.0.5"}]}</body> 
</html> 

Может возникнуть проблема? Не должен быть простой json без тегов тела и других вещей?

EDIT v3:

Теперь мой веб-сервис работает нормально и возвращает действительно JSon ответ. Я не получаю никаких ошибок на консоли js chrome.

Это как мой HTML и угловатые выглядит сейчас:

<html ng-app='myApp'> 
    <header> 
     <script src="./assets/js/angular.min.js"></script> 
    </header> 
    <body> 
     <div ng-controller="ShowServers"> 
      <ul> 
       <li ng-repeat="server in servers"> 
        {{ server.nom }} 
       </li> 
      </ul> 
     </div> 
     <!--<div ng-controller="GreetingController"> 
      {{ greeting }} 
     </div>--> 
    </body> 
    <!--<script src="./assets/js/angular.min.js"></script>--> 
    <script src="./assets/js/controller.js"></script> 
    <!--<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.5.0-beta.2/angular.min.js"></script>--> 
</html> 

var myApp = angular.module('myApp',[]); 

    $http.get('http://localhost/espaidiscos/WebService/ws.php/servidors').success(function(data, status, headers, config) { 
     $scope.servers = data; 
     console.log(data); 
     console.log(status); 
     console.log(headers); 
     console.log(config); 
    }). 
    error(function(data, status, headers, config) { 
     // log error 
     console.log("Error"); 
    }); 
}); 

РЕШИТЬ:

Я copyed пример на w3schools сайте: http://www.w3schools.com/angular/angular_http.asp

<script> 
var MyApp = angular.module('myApp', []); 
MyApp.controller('customersCtrl', function($scope, $http) { 
    $http.get("http://localhost/espaidiscos/WebService/ws.php/servidors") 
    .then(function(response) { 
        $scope.servers= response.data.servers; 
    }); 
}); 
</script> 
+0

просто дайте data.servers в обратном вызове успеха. –

ответ

1

Ошибка вы показываете из вашей сети консоль браузера подразумевает, что сервер не предоставляет объект JSON. Проверьте свой веб-сервис, чтобы убедиться, что он доказывает объект так, как вы ожидаете.

+0

Если я перейду к URL-адресу, я получаю следующее: {"servers": [{"idServidors": "1", "nom": "file01", "ip": "10.0.0.170"}, {"idServidors": «2», «nom»: «dc», «ip»: «10.0.0.5»}]} Я проверил с помощью онлайн-проверки JSON и выглядел нормально. – proktovief

+0

Это выглядит правильно. –

+0

Вам нужно сделать $ scope.servers = to data.servers – CleoR

3

Похоже, что может случиться 2 вещи. Во-первых, переменные серверы не создаются при запуске ng-repeat.

Второй сервер не имеет атрибута nom.

$scope.servers = []; 
//HTTP Request 

Кроме того, распечатайте переменную сервера из запроса, чтобы убедиться, что вы получаете то, что думаете.

EDIT:

Вы делаете $ scope.servers равно приемлю серверы. Вы должны сделать это равным data.servers. ng-repeat работает только над массивом.

EDIT2:

Если вы получаете сообщение об ошибке в функции обратного вызова ошибки, вы должны распечатать ответ серверов, чтобы попытаться отладки его. Не видя этой информации, я могу только догадываться о том, что происходит. Если вы можете опубликовать URL-адрес в своем браузере и получить JSON в порядке, но когда вы попробуете его из javascript, вы получите сообщение об ошибке, то оно может иметь какое-то отношение к типу ответа. Браузер будет использовать HTML-код ответа, где из Angular я считаю, что тип ответа будет JSON по умолчанию. Ваш сервер может ошибиться, если он не знает, как обращаться с последним.

EDIT3

var myApp = angular.module('myApp',[]); 
 

 
myApp.controller('ShowServers',function($scope,$http,GetServers){ 
 
\t GetServers.simGetServers($scope); 
 
}); 
 

 
myApp.factory('GetServers', function($http,$timeout){ 
 
\t var simGetServers = function(scope){ 
 
\t \t $timeout(function(){ 
 
\t \t \t data = {"servers": [{"idServidors":"1","nom":"file01","ip":"10.0.0.170"},{"idServidors":"2","nom":"dc","ip":"10.0.0.5"}]} 
 
\t \t \t scope.servers = data.servers; 
 
\t \t },200) 
 
\t }; \t 
 
\t var getServers = function(scope){ 
 
\t \t $http.get('http://localhost/espaidiscos/WebService/ws.php/servidors').success(function(data, status, headers, config) { 
 
     scope.servers = data.servers; 
 
    }). 
 
    error(function(data, status, headers, config) { 
 
     console.log(data); 
 
    }); 
 
\t }; 
 
\t return { 
 
\t \t getServers: function(scope){ 
 
\t \t \t getServers(scope); 
 
\t \t }, 
 
\t \t simGetServers: function(scope){ 
 
\t \t \t simGetServers(scope); 
 
\t \t } 
 
\t } 
 
});
<html> 
 
\t <header> 
 
\t \t <title>StackOverflow Question Response</title> 
 
     <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.8/angular.min.js"></script> 
 
\t </header> 
 
\t <body ng-app="myApp"> 
 
\t \t <div ng-controller="ShowServers"> 
 
\t \t \t <ul> 
 
\t \t \t \t <li ng-repeat="server in servers" ng-cloak> 
 
\t \t \t \t \t {{ server.nom }} 
 
\t \t \t \t </li> 
 
\t \t \t </ul> 
 
\t \t </div> 
 
\t \t <script src="index.js"></script> 
 
\t </body> 
 
</html>

Вы кладете свой сценарий вне тела тега!

+0

Я изменил, но все еще не работает: успех (функция, данные, статус, заголовки, конфиг) { $ scope.servers = data.servers; console.log ("work"); }). – proktovief

+0

data.servers верны, но также распечатывают $ scope.servers внутри console.log, чтобы убедиться, что вы возвращаете массив. Возможно, вам придется следовать моим другим советам и создавать экземпляры $ scope.servers перед тем, как сделать запрос HTML. Отправьте свою новую ошибку, когда вы ее получите. – CleoR

+0

Я попробовал и вернул «undefined». – proktovief

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