防止在 $resource POST 上使用查询字符串
Preventing use query string on $resource POST
我有一个 angularJS 应用程序,其 api 服务定义如下:
(function ()
{
'use strict';
angular
.module('myApp')
.factory('api', apiService);
/** @ngInject */
function apiService($resource)
{
var api = {};
// Base Url
api.baseUrl = 'http://localhost:37243/';
api.Auth = $resource(api.baseUrl + 'auth/:verb', {}, {
login: {
method: "POST",
params: {
verb: 'credentials'
}
},
logout: {
method: "GET",
params: { verb: 'logout' }
},
getSession: {
method: "GET",
params: { verb: 'session' }
}
});
return api;
}
})();
我正在从这样的 Auth 服务执行登录方法:
authService.login = function (user, success, error) {
var apiAuth = new api.Auth();
apiAuth.$login(user).then(
function (response) {
var loginData = response;
authService.getSession();
$rootScope.$broadcast(AUTH_EVENTS.loginSuccess);
success(loginData);
}, function (response) {
$rootScope.$broadcast(AUTH_EVENTS.loginFailed);
error(response);
});
};
api 调用有效,但它在查询字符串中传递有效负载而不是数据有效负载。我想我的 $resource 配置不正确,但无法找出原因。
正在发送的内容:
http://localhost:37243/auth/credentials?password=Password1&username=admin
我要发送的内容:
POST http://localhost:37243/auth/credentials
{password: 'Password1', username: 'admin'}
有什么想法吗?
我已经解决了问题...
原因是因为我正在实例化资源对象Auth,然后执行该方法。
根据 ngResource 文档,“非 GET”方法(如我的)的方法签名是:
non-GET "class" actions: Resource.action([parameters], postData,
[success], [error])
non-GET instance actions: instance.$action([parameters], [success], [error])
所以我是运行第二种没有postData参数的情况
更改我的代码以不实例化对象,如下所示,有效:
//the login function
authService.login = function(user, success, error) {
api.Auth.login(null, user).then(
function(response) {
var loginData = response;
authService.getSession();
$rootScope.$broadcast(AUTH_EVENTS.loginSuccess);
success(loginData);
}, function(response) {
$rootScope.$broadcast(AUTH_EVENTS.loginFailed);
error(response);
});
};
有关详细信息,请参阅 this SO answer(已投票)
我有一个 angularJS 应用程序,其 api 服务定义如下:
(function ()
{
'use strict';
angular
.module('myApp')
.factory('api', apiService);
/** @ngInject */
function apiService($resource)
{
var api = {};
// Base Url
api.baseUrl = 'http://localhost:37243/';
api.Auth = $resource(api.baseUrl + 'auth/:verb', {}, {
login: {
method: "POST",
params: {
verb: 'credentials'
}
},
logout: {
method: "GET",
params: { verb: 'logout' }
},
getSession: {
method: "GET",
params: { verb: 'session' }
}
});
return api;
}
})();
我正在从这样的 Auth 服务执行登录方法:
authService.login = function (user, success, error) {
var apiAuth = new api.Auth();
apiAuth.$login(user).then(
function (response) {
var loginData = response;
authService.getSession();
$rootScope.$broadcast(AUTH_EVENTS.loginSuccess);
success(loginData);
}, function (response) {
$rootScope.$broadcast(AUTH_EVENTS.loginFailed);
error(response);
});
};
api 调用有效,但它在查询字符串中传递有效负载而不是数据有效负载。我想我的 $resource 配置不正确,但无法找出原因。
正在发送的内容:
http://localhost:37243/auth/credentials?password=Password1&username=admin
我要发送的内容:
POST http://localhost:37243/auth/credentials {password: 'Password1', username: 'admin'}
有什么想法吗?
我已经解决了问题...
原因是因为我正在实例化资源对象Auth,然后执行该方法。
根据 ngResource 文档,“非 GET”方法(如我的)的方法签名是:
non-GET "class" actions: Resource.action([parameters], postData, [success], [error])
non-GET instance actions: instance.$action([parameters], [success], [error])
所以我是运行第二种没有postData参数的情况
更改我的代码以不实例化对象,如下所示,有效:
//the login function
authService.login = function(user, success, error) {
api.Auth.login(null, user).then(
function(response) {
var loginData = response;
authService.getSession();
$rootScope.$broadcast(AUTH_EVENTS.loginSuccess);
success(loginData);
}, function(response) {
$rootScope.$broadcast(AUTH_EVENTS.loginFailed);
error(response);
});
};
有关详细信息,请参阅 this SO answer(已投票)