通过REST客户端(如邮递员)将参数传递给dropwizard(Jersey)资源?

时间:2017-09-11 01:03:28

标签: java json rest jersey-2.0 dropwizard

老实说我以为我知道怎么做,显然不是。

这是我创建用户的基本资源。

@POST
@Path("create")
@Timed
@UnitOfWork
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public long createUser(@PathParam("username") String username,
                         @PathParam("password") String password)
{
    User userToCreate = new User();
    System.out.println("**********************************************");
    System.out.println(username + " " + password);
    System.out.println("**********************************************");

    userToCreate.setUsername(username);
    userToCreate.setPassword(password);

    // Save to database.
    return userDAO.create(userToCreate);
}

非常简单,System.out行只是为了帮助我调试,当它工作时它们将被删除(是的,我也将添加加密!)

无论如何,事实证明,无论我做什么 - 当通过PostMan向此发送数据时,用户名和密码的值总是为空......我不知道到底发生了什么。< / p>

我将字段“username”和“password”作为原始json发送给请求正文。

我错过了什么吗?

2 个答案:

答案 0 :(得分:1)

您必须在查询字符串中发送这些参数,而不是在正文中。例如:

POST http://localhost:8080/create?username=jsmith&password=foobar

另一种选择:

如果您确实想要将其发送到正文中,请创建一个对象来保存数据。

public class UserPass {
    private String username;
    private String password;

    public void setUsername(String username) {
         this.username = username;
    }

    public String getUsername() {
         return username;
    }

    public void setPassword(String password) {
         this.password = password;
    }

    public String getPassword() {
         return password;
    }
}

并将您的方法签名更改为:

public long createUser(UserPass userPass) {
   User userToCreate = new User();
   System.out.println("**********************************************");
   System.out.println(userPass.getUsername() + " " + userPass.getPassword());
   System.out.println("**********************************************");

   userToCreate.setUsername(userPass.getUsername());
   userToCreate.setPassword(userPass.getPassword());

   // Save to database.
   return userDAO.create(userToCreate);    
}

然后用JSON发布这样的内容:

{
   "username": "jsmith",
   "password": "foobar"
}

确保将Content-Type设置为&#34; application / json&#34;在POST请求上。

答案 1 :(得分:1)

您正在使用@PathParam注释来检索资源函数的输入,但使用Body发送数据。

您需要将用户名和密码作为路径参数发送,如

  

xyz.com/create/ {用户名} / {密码}

您需要创建一个请求类并将其用作输入参数,以便从请求正文中获取数据,如

@Getter
@Setter
public class RegisterRequest{
     private String username;
     private String password;
}

并像

一样使用它
@YourAnnotations
public long create(RegisterRequest request){
     //Your code for creating user.
}