【问题标题】:How to pass user defined objects to REST service from angularjs如何将用户定义的对象从 angularjs 传递给 REST 服务
【发布时间】:2013-10-23 13:54:10
【问题描述】:

我对 Anuglar JS 还很陌生,所以在回答这个问题时请记住这一点。我的目标是在 oracle 数据库中创建和持久化一个新用户。我的前端是用 AngularJS 编写的。 REST 服务(使用 JERSEY)已经到位,方法签名如下:

 @POST
 @Path("/create/{user}")
 public void createUser(@QueryParam("user") User user){ ...}

带有 REST 调用的 AngularJS 工厂如下所示:

angular.module('app.services', ['ngResource'])
.factory('User', function($resource) 
 {
   return 
   {
        createUser: $resource('/myurl/create/:user', {}, {
            query: {
                method: 'POST',
                params: {user: '@user'},
                isArray: false
            }
        })
   });

User.java 具有以下属性:

private String firstName;
private String lastName;
private String email;

我相信上述工厂设置正确。我已验证创建用户的后端 REST 服务也可以正常工作。前端有一个表单,允许用户输入 FirstName、LastName 和 Email,它们应该是 User 对象的一部分。我认为 User 对象应该通过以下方式提交给 Rest 服务:

Step1:用用户数据制作一个对象 Step2:User.createUser.query(user:)

我不确定这些步骤是否正确,如果正确,那么如何准确地制作对象。有人可以提供一些指导方针。谢谢

【问题讨论】:

    标签: java rest angularjs


    【解决方案1】:

    你的资源应该反映对象而不是动作,你的资源应该被称为“用户”。创建、更新、查询都体现在 http 方法中。

    我会像这样实现它。其中很大一部分直接来自文档 - http://docs.angularjs.org/api/ngResource.$resource

    angular.module('app.services', ['ngResource'])
    
    .controller('MyController', function(User) {
    
        // Query userID 123, change the firstname and lastname then save.
        var user = User.get({userId:123}, function() {
          user.firstname = "joe";
          user.lastname = "bloggs";
          user.$save();
        }
    
       // Create a new user like this.
       var anotherUser = new User({
         username: 'joe.bloggs',
         email: 'joe.bloggs@example.com',
         firstname: 'joe',
         lastname: 'bloggs'
       });
    
       anotheruser.$save();
     })    
    
    .factory('User', function($resource) 
     {       
        // Represent the user resource.
        return $resource('/myurl/create/:userId', {userId:'@id'});    
    
     });
    

    【讨论】:

    • 我以前见过这个,我不明白你怎么说 User.get({userId:123}... get 和 $save 定义在哪里?抱歉,我确定这是一个新手问题。谢谢。
    • 这是 $resource 返回的资源表示的接口。您可以从中获取、发布、放置、删除。
    • 我刚刚更新了示例以包括创建新资源。资源不是操作,它是您可以对其执行操作的数据集(抱歉,如果您已经知道这一点)。例如: POST 到 /user -> 创建一个新用户,并应返回我的新用户的表示(包括 ID)。 GET to /user/123 -> 为您的用户返回数据集,类似于您在 POST 后返回的数据。 PUT to /user/123 -> 修改用户数据集中的所有数据。应该返回类似于 GET 的东西。关键是它都是“用户”资源。 $resource 试图证明这一点。
    • 我非常感谢您的解释!我注意到您的 return 语句是 $resource stmt 本身。在我的帖子中,我返回了 { createUser: .... }。我这样做的原因是我可以将各种休息端点(getUserById、getUserBySsn 等)映射到同一个用户工厂。在你的例子中我怎么能做到这一点?仍在尝试了解这种魔法是如何发生的..
    • 每个都有一个端点,这是 REST 与普通 API 不同之处的一部分。创建搜索是不同的。在 /user/123 上执行 GET 以通过其 ID 加载用户,但如果您想进行搜索,您应该在 /user?ssn=1234567 上执行 GET。 $resource 会注意到不在占位符 (:userID) 中的任何数据,并将追加到查询字符串中。所以 User.get({ssn: 1234567}) 将向 /user?ssn=1234567 发出 GET 请求
    【解决方案2】:

    QueryParam 通常与 GET 方法一起使用来发送单个属性,试试这个:

    在你的 java 代码中

     @POST
     @Path("/create/")
     public void createUser(User user){ ...}
    

    在你的 js 代码中

    angular.module('app.services', ['ngResource'])
    .factory('User', function($resource){
    
        var user = $resource('/myurl/create/', {}, {
          createUser: {method:'POST', params:{...}}
        });
    
        return user;        
    });
    

    你可以在javaherehere找到更多关于rest的信息,关于角度资源here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-21
      • 2017-04-06
      • 1970-01-01
      • 2015-07-27
      相关资源
      最近更新 更多