对URL中的API发送参数的POST请求

时间:2014-12-10 15:46:53

标签: ruby-on-rails angularjs cordova

我在Ruby on Rails中有一个网站,它可以运行。现在,我正在开发一个移动应用程序来补充该网络。我正在使用Cordova和AngularJS(v1.2.13)。

使用该应用程序(作为用户)的第一步是使用与Web中相同的凭据登录。为了将应用程序与数据库连接,我正在开发Rails中的API。

从应用程序登录有效,但在对API进行POST调用时,参数会附加到URL:

http://localhost:3000/api/sign_in?email=user@example.com&password=1234

由于显而易见的原因,这是不安全的。我希望从URL中删除这些参数:

http://localhost:3000/api/sign_in

我不明白为什么没有传递参数'hidden'。我错过了什么?

在我的角色服务中,我有:

app.factory('loginService', ['$resource', 'BASE_URL', function($resource, BASE_URL){
    return $resource(BASE_URL + '/api/sign_in', {email:'@email', password:'@password'}, {
        'sign_in': {
            method: 'POST',
            isArray: false,
            headers: {'Content-Type': 'application/x-www-form-urlencoded'}
        }
    });
}]);

在控制器中:

var logged = loginService.sign_in({email: $scope.email, password: $scope.password},
                 function(data){ /*do whatever with the data*/}
             );

修改

我忘了提到我使用Devise进行身份验证。 路由:

namespace :api do 
    devise_scope :user do 
      post "/sign_in", :to => 'sessions#create'
    end
  end

给了我:

api_sign_in POST   /api/sign_in(.:format)

控制器,以防需要:

class Api::SessionsController < Api::ApiController

  include Devise::Controllers::InternalHelpers

  def create
    ...
  end

end

2 个答案:

答案 0 :(得分:0)

我不太熟悉Ruby(就是Ruby,对吧?),但是如果你只是想在不更改URL的情况下点击API端点,这里有一些代码的示例,它一直在为我工作而没有你所描述的问题。我认为最重要的是/:id/:controller部分。

我希望这会有所帮助,但我正在使用客户端路由,所以这会影响事情。

 angular.module('dayakoApp')
  .factory('User', function ($resource) {
    return $resource('/api/users/:id/:controller', {
      id: '@_id'
    },
    {
      changePassword: {
        method: 'PUT',
        params: {
          controller:'password'
        }
      },
      get: {
        method: 'GET',
        params: {
          id:'me'
        }
      }
      });
  });

答案 1 :(得分:0)

由于SO question

,我终于成功了

基本上可以从服务中删除params:

maappServices.factory('loginService', ['$resource', '$http', 'BASE_URL', function($resource, $http, BASE_URL){
    return $resource(BASE_URL + '/api/sign_in', {/*REMOVE params from this part*/}, {
        'sign_in': {
            method: 'POST',
            isArray: false
        }
    });
}]);

现在对api的调用是这样完成的:Started POST "/api/sign_in" 我还删除了标题部分以便工作。