Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通过REST客户端(如postman)将参数传递给dropwizard(Jersey)资源?_Java_Json_Rest_Jersey 2.0_Dropwizard - Fatal编程技术网

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,否则最好不要将这种负载作为查询字符串的一部分发送(即使加密)。它将显示在访问日志等中。请参阅