【问题标题】:Preventing use query string on $resource POST防止在 $resource POST 上使用查询字符串
【发布时间】:2016-06-14 21:17:21
【问题描述】:

我有一个 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

我想要发送的内容:

发布http://localhost:37243/auth/credentials {密码:'Password1',用户名:'admin'}

有什么想法吗?

【问题讨论】:

  • 尝试替换登录资源中的动词参数
  • @Erez 我不是 100% 确定你的意思,但我已经尝试覆盖 url 以使其没有 :verb 参数,并从方法覆盖中删除了 param 对象,没有任何喜悦......?
  • 登录:{ 方法:“POST”,参数:{ cerd: 'credentials' } },
  • 或尝试添加 {verb: "@ver" }, 这里 $resource(api.baseUrl + 'auth/:verb', {verb: "@verb"}, {
  • 没有区别;老实说-我不知道您为什么建议这样做-调用有效,但我想隐藏查询字符串参数;我不明白为什么它与动词有任何关系?你介意解释一下你的想法吗?

标签: angularjs angular-resource


【解决方案1】:

我已经解决了问题...

原因是因为我在实例化资源对象Auth,然后执行方法。

从 ngResource 文档中,“非 GET”方法(如我的)的方法签名是:

非 GET “类”操作:Resource.action([parameters], postData, [成功],[错误])

非 GET 实例操作: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(已投票)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-02
    • 1970-01-01
    • 1970-01-01
    • 2015-04-02
    • 2015-08-06
    • 1970-01-01
    • 2017-12-13
    相关资源
    最近更新 更多