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资源交互(转)

AngularJS:使用 $resource 上传文件(解决方案)

AngularJS Resource:与 RESTful API 交互