【问题标题】:@RequestParam return null value from Postman@RequestParam 从邮递员返回空值
【发布时间】:2021-07-29 17:42:57
【问题描述】:

我正在尝试使用 Spring Boot 进行登录 Restful API。我正在使用 Postman 来测试 API。但是当我通过邮递员传递电子邮件和密码时,它返回空参数。因此,我的其他功能无法正常工作。这是我的代码:

登录控制器

@PostMapping("/login1")
@ResponseBody
public Response1 login(@RequestParam(name="email",required=false) String email, @RequestParam(name="password",required=false) String password) {    
        
       System.out.println("Email is:"+email);
       System.out.println("Password is:"+password);
       return lgservice.checkLogin(email, password);      
}

PostMapping URL: http://localhost:8080/login1 我通过邮递员发送以下数据:

{
    "email": "Sbjain@gmail.com",
    "password": "sbj123"
    
}

我的预期输出是这样的:

{
    "code": 200,
    "status": "Success",
    "message": "Login Successfull!",
    "college": [
     {
       "clgId": 50,
       "name": "SB Jain",
       "email": "Sbjain@gmail.com",
       "city": "nagpur"
     }
    ]
}

但我得到了这个:

{
    "code": 500,
    "status": "Failed",
    "message": "Please enter valid email and password",
    "isSuccess": false
}

日志

2021-05-07 17:18:48.750  INFO 11448 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2021-05-07 17:18:48.757  INFO 11448 --- [           main] s.c.CunsultustodayWebServicesApplication : Started CunsultustodayWebServicesApplication in 4.246 seconds (JVM running for 5.143)
2021-05-07 17:18:56.665  INFO 11448 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
2021-05-07 17:18:56.665  INFO 11448 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2021-05-07 17:18:56.666  INFO 11448 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 1 ms
Email is:null
Password is:null

如果我做错了什么,请指导我。谢谢!

【问题讨论】:

    标签: spring spring-boot api post postman


    【解决方案1】:

    发生这种情况是因为@RequestParam 保留查询参数 (@RequestParam JavaDoc)。所以,这个 API 的正确用法应该是POST http://localhost:8080/login1?email=test@example.com&password=pass

    如果您想在请求正文中传递参数,您需要使用@RequestBody (JavaDoc) 并创建一个包含emailpassword 字段的POJO,或者使用Map(我不建议这样做)。这是一个例子

    // User.java
    public class User {
        
        private String email;
        private String password;
    
        // getters, setters, constructors, etc.
    }
    
    @PostMapping("/login1")
    @ResponseBody
    public Response1 login(@RequestBody User user) {    
           System.out.println("Email is: " + user.getEmail());
           System.out.println("Password is: " + user.getPassword());
           return lgservice.checkLogin(user.getEmail(), user.getPassword());      
    }
    

    【讨论】:

    • 是的,我错过了 POJO 课程。我创造它。它对我有用,谢谢。 @geobreze
    【解决方案2】:

    使用 json 请求正文你需要一个 pojo

    class LoginRequest {
    
    public String email;
    public String password;
    
    }
    

    并将控制器更改为

    public Response1 login(@RequestBody LoginRequest loginRequest) {
    

    或将登录数据作为表单参数发送。

    https://www.baeldung.com/spring-mvc-send-json-parameters

    【讨论】:

      【解决方案3】:

      原因:您将登录详细信息作为 JSON 正文发送,可以使用 @RequestBody 进行映射,并且您使用的是 @RequestParam,您必须在其中将详细信息作为查询参数传递。理想的方法是创建 DTO 并使用 @RequestBody


      当您使用@RequestParam 时,您必须将详细信息作为查询参数发送

      URL: host:port/endpoint?param1=value1&param2=value2
      URL: http://localhost:8080/login1?email=Sbjain@gmail.com&password=sbj123
      
      @PostMapping("/login1")
      @ResponseBody
      public Response1 login(@RequestParam(name="email",required=false) String email, @RequestParam(name="password",required=false) String password) {   
         ...
      } 
      

      目前,您将详细信息作为 JSON 正文发送,可以使用 @RequestBody 进行映射,并且您必须创建 DTO 来映射键。

      class LoginRequestDTO {
          public String email;
          public String password;
      }
      
      @PostMapping("/login1")
      @ResponseBody
      public Response1 login(@RequestBody LoginRequestDTO loginRequest) {   
         ...
      } 
      
      //JSON body as input
      {
          "email": "Sbjain@gmail.com",
          "password": "sbj123"  
      }
      

      Here你可能知道更多关于spring boot注解的细节

      【讨论】:

      • 谢谢,这很有帮助@PatelRomil
      猜你喜欢
      • 2020-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-16
      • 2021-10-24
      • 2016-02-08
      • 1970-01-01
      • 2020-12-31
      相关资源
      最近更新 更多