AngularJS POST 与 $resource 在查询字符串中发送,我做错了啥?
Posted
技术标签:
【中文标题】AngularJS POST 与 $resource 在查询字符串中发送,我做错了啥?【英文标题】:AngularJS POST with $resource sending in query string, what am I doing wrong?AngularJS POST 与 $resource 在查询字符串中发送,我做错了什么? 【发布时间】:2015-08-06 11:20:55 【问题描述】:我对 Angular 有点陌生,在尝试发布到 Drupal 服务端点时遇到问题。我可以使用 HttpRequester(FFox 插件)进行发布,但是我使用 Angular 发布数据以获取会话的所有尝试都会导致 401 Unauthorized: missing required argument username or other errors。
这是我使用默认输入的测试工厂资源:
userInfoApp.factory('LoginService', function($resource)
return $resource('/auth-service/user/login', username: 'admin', password: 'admin',
update:
method: 'POST', // this method issues a POST request
headers:'Content-Type':'application/x-www-form-urlencoded; charset=UTF-8'
);
);
这是我在控制器内部对其进行的调用(this):
this.login = function()
var login = LoginService.update(function(data)
console.log(data);
);
;
到目前为止,这通常会导致生成如下查询字符串:
http://project.loc/auth-service/user/login?password=admin&username=admin
以及以下的回应:
401 Unauthorized : 缺少必需的参数用户名
我在这里可能做错了什么?我已经让 $resource 可以与其他端点一起正常工作(例如用于检索菜单的菜单服务),但是发布似乎更加挑剔。任何建议将不胜感激。
谢谢
【问题讨论】:
您的 $resource 配置似乎正在使用 POST 方法。并且您的 URL 有查询字符串?你能检查一下你的 Drupal 服务端点是否可以获得这些参数吗?我相信你的 Drupal 服务调试不会得到参数! 否,服务无法获取参数。事实上,我不希望这样。我希望 POST 实际发布。登录不应该发生在查询字符串上。 【参考方案1】:您当前的 $resource 配置将用户名和密码作为查询字符串发送。因此它们出现在您的 URL 中。我假设您需要将这些值设为 POST。
根据文档,所有非 GET 方法在 action
方法中都有一个有效负载参数:
非 GET “类”操作:Resource.action([parameters], postData, [成功],[错误])
您需要做的是停止将参数作为默认[parameters]
发送,并使用postData
将数据POST 到您的Drupal 服务端点。当您调用$update()
时,您可以这样做:
LoginService.update(, username: "admin",password: "admin");
【讨论】:
对不起,这没有做到。将服务调用更改为:this.login = function() var login = LoginService.update(, username: "admin", password: "admin"); ;它没有任何影响。【参考方案2】:好的,我找到了一种可行的方法;对于控制器功能:
this.login = function()
var data =
username: this.username,
password: this.password
;
var login = LoginService.save(, data,
function(data)
// possibly do stuff with result
,
function(reply)
// Comments on best way to access $scope here are welcome.
// This feels a bit weird to me.
$scope.info.errorMessage = reply.statusText;
);
;
对于工厂服务:
// Login factory service
userInfoApp.factory('LoginService', function($resource)
return $resource('/auth-service/user/login');
);
这实际上是从服务器检索会话 ID 和其他用户数据。
【讨论】:
以上是关于AngularJS POST 与 $resource 在查询字符串中发送,我做错了啥?的主要内容,如果未能解决你的问题,请参考以下文章
Cordova 上的 AngularJS $resource POST 调用不能在 iOS/Android 设备上运行,但可以在浏览器上运行
Angularjs多个HTTP POST请求导致net :: ERR_INSUFFICIENT_RESOURCES
AngularJS - 将 REST 搜索端点映射到 $resource
黄聪:AngularJS中的$resource使用与Restful资源交互(转)