【问题标题】: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 实际发布。登录不应该发生在查询字符串上。

标签: angularjs web-services rest 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 和其他用户数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-09
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-26
    相关资源
    最近更新 更多