Java 通过REST客户端(如postman)将参数传递给dropwizard(Jersey)资源?
我真的以为我知道怎么做,显然不是 这是我创建用户的基本资源Java 通过REST客户端(如postman)将参数传递给dropwizard(Jersey)资源?,java,json,rest,jersey-2.0,dropwizard,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("pas
@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行只是为了帮助我调试,它们将在工作时被删除(是的,我也将添加加密!)
不管怎样,事实证明,无论我做了什么——当通过邮递员发送数据给这个网站时,用户名和密码的值总是空的。。。我不知道到底发生了什么
我将字段“username”和“password”作为原始json发送,并将ID作为请求主体
我遗漏了什么吗?您必须在查询字符串中而不是正文中发送这些参数。例如:
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);
}
{
"username": "jsmith",
"password": "foobar"
}
然后用JSON发布如下内容:
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);
}
{
"username": "jsmith",
"password": "foobar"
}
请确保在POST请求中将内容类型设置为“application/json”。您必须在查询字符串中而不是正文中发送这些参数。例如:
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);
}
{
"username": "jsmith",
"password": "foobar"
}
然后用JSON发布如下内容:
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);
}
{
"username": "jsmith",
"password": "foobar"
}
请确保在POST请求中将内容类型设置为“application/json”。您使用@PathParam annotation来检索资源函数的输入,但使用正文发送数据 您需要将用户名和密码作为路径参数发送,如 xyz.com/create/{username}/{password} 或 您需要创建一个请求类,并将其用作输入参数,以便从请求体中获取数据,如
@Getter
@Setter
public class RegisterRequest{
private String username;
private String password;
}
像这样使用它
@YourAnnotations
public long create(RegisterRequest request){
//Your code for creating user.
}
您正在使用@PathParam annotation检索资源函数的输入,但使用正文发送数据 您需要将用户名和密码作为路径参数发送,如 xyz.com/create/{username}/{password} 或 您需要创建一个请求类,并将其用作输入参数,以便从请求体中获取数据,如
@Getter
@Setter
public class RegisterRequest{
private String username;
private String password;
}
像这样使用它
@YourAnnotations
public long create(RegisterRequest request){
//Your code for creating user.
}
是的,我应该提到这一点,抱歉-我确实有那个设置-但出于某种原因,所有内容都是空的…抱歉,意识到了这个问题并删除了我的评论,希望你不会看到它:)。您正在使用PathParam,但发送正文中的数据(不是路径)是的,我应该提到,抱歉-我有该设置-但出于某种原因,所有内容都为空…抱歉,意识到了问题并删除了我的评论,希望您不会看到它:)。您使用的是PathParam,但在正文(而不是路径)中发送数据。如果希望将数据放入这样的查询中,技术上可以使用
QueryParam
PathParam
用于作为URI的路径部分传入的参数(例如/users/{username}/{password}是的,这一点您是对的。但是,正如您所说,您必须加密用户名和密码。将此类负载作为查询字符串的一部分发送(即使已加密)从来都不是一个好主意除非您使用的是HTTPS。它将显示在访问日志等中。请参阅技术上的说明,如果希望将它们放入这样的查询中,则可以使用QueryParam
。PathParam
用于作为URI的路径部分传入的参数(例如/users/{username}/{password}是的,你是对的。但是正如你所说,你必须加密你的用户名和密码。除非你使用HTTPS,否则最好不要将这种负载作为查询字符串的一部分发送(即使加密)。它将显示在访问日志等中。请参阅