【问题标题】:Passing arguments to a dropwizard (Jersey) resource via a REST client, such as postman?通过 REST 客户端(例如邮递员)将参数传递给 dropwizard (Jersey) 资源?
【发布时间】:2017-09-11 01:03:28
【问题描述】:

我真的以为我知道该怎么做,显然不知道。

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

@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 向它发送数据时,用户名和密码的值始终为空......我不知道到底发生了什么。

我在请求正文中将“用户名”和“密码”字段作为原始 json 发送。

我错过了什么吗?

【问题讨论】:

  • 是的,我应该提到这一点,对不起 - 我确实有那个设置 - 但出于某种原因,一切都是空的......
  • 对不起,意识到了这个问题并删除了我的评论,希望你不会看到它:)。您正在使用 PathParam,但在正文中发送数据(不是路径)

标签: java json rest jersey-2.0 dropwizard


【解决方案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"
}

确保在 POST 请求中将 Content-Type 设置为“application/json”。

【讨论】:

  • 从技术上讲,如果他们想将它们放在这样的查询中,可以使用QueryParamPathParam 用于作为 URI 的路径部分传入的参数(例如 /users/{username}/{password}
  • 是的,你是对的。但是,正如您所说,您必须加密您的用户名和密码。除非您使用 HTTPS,否则将这种有效负载作为查询字符串的一部分(即使已加密)发送绝不是一个好主意。它将显示在访问日志等中。见stackoverflow.com/questions/323200/…
【解决方案2】:

您正在使用 @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.
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-16
    • 1970-01-01
    • 2015-06-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多