$http.get 无法从 SpringBoot 控制器获取数据
$http.get unable to fetch data from SpringBoot controller
我正在创建一个应用程序,它将根据用户在网页上输入的内容 运行 查询我商店的数据库。我已经成功创建了后端方法。它成功地 returns 响应。但是我无法检索数据并将其以动态 table 的形式显示在我的网页上。我对 AngularJS 有点陌生,所以请多多包涵,但如有任何帮助,我们将不胜感激。
StoreController.java
@RequestMapping(value = "/runQuery", method = RequestMethod.GET)
public List<Map<String, Object>> runQuery(@RequestParam(value="query", defaultValue="* FROM items") String statement, Model model) {
List<Map<String, Object>> answer = storeService.executeUserQuery(statement);
model.addAttribute("resultList", answer);
return answer;
}
我尝试以这样一种方式对我的控制器进行建模,使其可以动态获取从 Java 控制器接收到的数据并将其分配给 $scope 变量。
app.module.js
(function(){
'use strict';
angular.module('app', []);
})();
store.controller.js
angular
.module('app').controller('StoreController', ['$scope','StoreService','StoreController','$q', function ($scope,StoreService, StoreController, $q) {
$scope.runQuery = function () {
StoreService.runQuery($scope.statement)
.then (function (data){
$scope.rows = response.data;
$scope.cols = Object.keys($scope.rows[0]);
},
function error(response){
if (response.status == 404){
$scope.errorMessage = response.data[0];
}
else {
$scope.errorMessage = 'Error displaying result user!';
}
});
}
}
]);
app.service('StoreService',['$http', function ($http,$q) {
this.runQuery = function runQuery(statement){
return $http({
method: 'GET',
url: 'http://localhost:8080/runQuery/',
params: {statement:statement},
headers: 'Accept:application/json'
}).then( function(response){
return reponse.data;
});
}
index.html
<body data-ng-app="app" data-ng-controller="StoreController">
<div class="container">
<form th:action="@{/logout}" method="get">
<button class="btn btn-md btn-danger btn-block"
style="color: #fff; background-color: #e213a2; border-color: #c3c2c0;"
name="registration" type="Submit">Logout</button>
</form>
<div class="panel-group" style="margin-top: 40px">
<div class="panel panel-primary">
<div class="panel-heading">
<span th:utext="${userName}"></span>
</div>
<div>
<form name="queryForm" method="get" data-ng-submit="runQuery()">
<div class="panel-body">
<h3 id="queryLabel">Select Query:</h3>
<textarea id="query" wrap="soft"
placeholder="Please do not enter SELECT with your query, it's added automatically!!" data-ng-model="statement"></textarea>
<button type="submit">Run Query</button>
</div>
</form>
<div class="panel-body" id="results">
<h3 id="queryLabel">Result:</h3>
<table border="1">
<tr>
<th data-ng-repeat="column in cols">{{column}}</th>
</tr>
<tr data-ng-repeat="row in rows">
<td data-ng-repeat="column in cols">{{row[column]}}</td>
</tr>
</table>
</div>
</div>
<div>
<p class="admin-message-text text-center" th:utext="${adminMessage}"></p>
</div>
</div>
</div>
</div>
</body>
html 页面上的 table 有效,因为我是从这个 link 收到的
http://jsfiddle.net/v6ruo7mj/1/
但它没有使用从我的后端控制器方法接收到的数据填充 tables。我没有任何实体,因为这只是查询现有数据库,所以我不需要添加任何实体。
问题可能出在您控制器中服务回调中的这一行:
.then (function (data){
$scope.rows = response.data;
// ...
}
试试:
.then (function (data){
$scope.rows = data;
// ...
}
您已经 return 调用时服务中的响应数据:
}).then( function(response){
return reponse.data;
});
除了你的问题,我应该提到你的 Spring 控制器似乎容易受到 SQL 注入。允许用户直接访问您的数据库通常不是一个好主意。虽然不知道你后端的StoreService是怎么实现的。但似乎攻击者可以轻松地向您的端点发送 HTTP 调用并删除您的数据库。
您在 runQuery
函数中有错别字:
app.service('StoreService',['$http', function ($http,$q) {
this.runQuery = function runQuery(statement){
return $http({
method: 'GET',
url: 'http://localhost:8080/runQuery/',
params: {statement:statement},
headers: 'Accept:application/json'
}).then( function(response){
̶r̶e̶t̶u̶r̶n̶ ̶ ̶r̶e̶p̶o̶n̶s̶e̶.̶d̶a̶t̶a̶;̶
return response.data
});
}
}]);
我正在创建一个应用程序,它将根据用户在网页上输入的内容 运行 查询我商店的数据库。我已经成功创建了后端方法。它成功地 returns 响应。但是我无法检索数据并将其以动态 table 的形式显示在我的网页上。我对 AngularJS 有点陌生,所以请多多包涵,但如有任何帮助,我们将不胜感激。
StoreController.java
@RequestMapping(value = "/runQuery", method = RequestMethod.GET)
public List<Map<String, Object>> runQuery(@RequestParam(value="query", defaultValue="* FROM items") String statement, Model model) {
List<Map<String, Object>> answer = storeService.executeUserQuery(statement);
model.addAttribute("resultList", answer);
return answer;
}
我尝试以这样一种方式对我的控制器进行建模,使其可以动态获取从 Java 控制器接收到的数据并将其分配给 $scope 变量。
app.module.js
(function(){
'use strict';
angular.module('app', []);
})();
store.controller.js
angular
.module('app').controller('StoreController', ['$scope','StoreService','StoreController','$q', function ($scope,StoreService, StoreController, $q) {
$scope.runQuery = function () {
StoreService.runQuery($scope.statement)
.then (function (data){
$scope.rows = response.data;
$scope.cols = Object.keys($scope.rows[0]);
},
function error(response){
if (response.status == 404){
$scope.errorMessage = response.data[0];
}
else {
$scope.errorMessage = 'Error displaying result user!';
}
});
}
}
]);
app.service('StoreService',['$http', function ($http,$q) {
this.runQuery = function runQuery(statement){
return $http({
method: 'GET',
url: 'http://localhost:8080/runQuery/',
params: {statement:statement},
headers: 'Accept:application/json'
}).then( function(response){
return reponse.data;
});
}
index.html
<body data-ng-app="app" data-ng-controller="StoreController">
<div class="container">
<form th:action="@{/logout}" method="get">
<button class="btn btn-md btn-danger btn-block"
style="color: #fff; background-color: #e213a2; border-color: #c3c2c0;"
name="registration" type="Submit">Logout</button>
</form>
<div class="panel-group" style="margin-top: 40px">
<div class="panel panel-primary">
<div class="panel-heading">
<span th:utext="${userName}"></span>
</div>
<div>
<form name="queryForm" method="get" data-ng-submit="runQuery()">
<div class="panel-body">
<h3 id="queryLabel">Select Query:</h3>
<textarea id="query" wrap="soft"
placeholder="Please do not enter SELECT with your query, it's added automatically!!" data-ng-model="statement"></textarea>
<button type="submit">Run Query</button>
</div>
</form>
<div class="panel-body" id="results">
<h3 id="queryLabel">Result:</h3>
<table border="1">
<tr>
<th data-ng-repeat="column in cols">{{column}}</th>
</tr>
<tr data-ng-repeat="row in rows">
<td data-ng-repeat="column in cols">{{row[column]}}</td>
</tr>
</table>
</div>
</div>
<div>
<p class="admin-message-text text-center" th:utext="${adminMessage}"></p>
</div>
</div>
</div>
</div>
</body>
html 页面上的 table 有效,因为我是从这个 link 收到的 http://jsfiddle.net/v6ruo7mj/1/
但它没有使用从我的后端控制器方法接收到的数据填充 tables。我没有任何实体,因为这只是查询现有数据库,所以我不需要添加任何实体。
问题可能出在您控制器中服务回调中的这一行:
.then (function (data){
$scope.rows = response.data;
// ...
}
试试:
.then (function (data){
$scope.rows = data;
// ...
}
您已经 return 调用时服务中的响应数据:
}).then( function(response){
return reponse.data;
});
除了你的问题,我应该提到你的 Spring 控制器似乎容易受到 SQL 注入。允许用户直接访问您的数据库通常不是一个好主意。虽然不知道你后端的StoreService是怎么实现的。但似乎攻击者可以轻松地向您的端点发送 HTTP 调用并删除您的数据库。
您在 runQuery
函数中有错别字:
app.service('StoreService',['$http', function ($http,$q) {
this.runQuery = function runQuery(statement){
return $http({
method: 'GET',
url: 'http://localhost:8080/runQuery/',
params: {statement:statement},
headers: 'Accept:application/json'
}).then( function(response){
̶r̶e̶t̶u̶r̶n̶ ̶ ̶r̶e̶p̶o̶n̶s̶e̶.̶d̶a̶t̶a̶;̶
return response.data
});
}
}]);