【问题标题】:Restangular POST not passing data parametersRestangular POST不传递数据参数
【发布时间】:2014-11-28 13:44:10
【问题描述】:

我刚开始使用restangular。话虽如此,我有以下 POST 调用,由于某种原因没有按预期工作。

Restangular.all("user").all("login").post({username: 'test@user.com', password: 'xyz'}).then(function(account)
{ 
     console.log(account);
});

我看到 POST 请求发送到正确的 URL /api/v1/user/login。但是,post 参数似乎没有被传递。查看同一个 POST 请求,我看不到用户名/密码数据。此外,我的 API 抛出一个未经授权的错误,告诉我它无法根据凭据验证用户。

我也尝试过如下变种...

Restangular.one("user").post("login", {username: 'test@user.com', password: 'xyz'}).then(function(account)
{ 
    console.log(account);

}) 

似乎仍然没有发送帖子数据。我也试过...

Restangular.all("user").post("login", {username: 'test@user.com', password: 'xyz'}).then(function(account)
{ 
    console.log(account);

}) 

这似乎创建了一个不正确的 url /api/v1/user,并且仍然看不到任何帖子数据。

我可以对 /api/v1/user/login 执行 cURL POST 请求,毫无问题地传入 POST 数据。

cURL -X POST /api/v1/user/login -d "username=test@user.com&password=xyz"

我还更新了我的 curl 声明,正如 @David 在他对...的回答中所建议的那样

curl -X POST -d '{"username": "test@user.com", "password": "xyz"}' '/api/v1/user/login' -H Content-Type:application/json

这仍然有效。但是,使用 restangular 发布不会...

Restangular.all("user").post("login", {username: 'test@user.com', password: 'xyz'}).then(function(account)
    { 
        console.log(account);

    }) 

其他想法?

【问题讨论】:

  • 刚刚面对同样的静止角行为。你解决了这个问题吗?
  • 我也有同样的问题,请问有答案吗?我的意思是restangular不能传递body参数吗?

标签: ruby-on-rails angularjs ruby-on-rails-4 restangular


【解决方案1】:

您发送的帖子参数不正确,您有:

Restangular.all("user").all("login")
.post({username: 'test@user.com', password: 'xyz'})
.then(function(account) { 
    console.log(account); 
});

因此,您需要进行一些更改,它会起作用(正确发送正文参数):

Restangular.all("user").all("login")
.post('', {username: 'test@user.com', password: 'xyz'})
.then(function(account) { 
    console.log(account); 
});

注意:我在 restangular v1.5.2 上尝试过

祝你好运!

【讨论】:

    【解决方案2】:

    我知道这是一岁的问题,但无论如何。我遇到了同样的问题,我相信我找到了解决这个问题的方法。一切都在 Restangular.setRequestInterceptor 事件中。因此,如果您的代码中有这样的拦截器,那么您需要确保它在执行所需操作后返回接受的元素参数。比如我以前就是这样的:

    Restangular.setRequestInterceptor(function () {
                $rootScope.validationErrors = [];
                activeRequests++;
                $rootScope.loading = true;          
            })
    

    这就是应该做的:

    Restangular.setRequestInterceptor(function (element, operation, what, url) {
            $rootScope.validationErrors = [];
            activeRequests++;
            $rootScope.loading = true;
            return element;
        })
    

    【讨论】:

      【解决方案3】:

      我不是 Restangular 方面的专家,但似乎 .all() 为一个对象创建了一整套 REST API。在这种情况下,我认为您只想在“用户”上调用 .all() 并将登录用作子资源。

      var users = Restangular.all("user");
      
      users.post('login', {
        username: 'test@user.com',
        password: 'xyz'
      }).then(...);
      

      您还需要确保您的服务器确实有一个POST /users/login 端点。

      【讨论】:

      • 谢谢我已经尝试过那个变种,但是还是不行。我已更新我的问题以包含更多详细信息。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-03
      • 1970-01-01
      • 2015-01-01
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多