Retrofit @Body 后台收到数据为空

发布时间 2023-08-09 16:09:55作者: cps666

原文地址 www.jianshu.com

最近对项目进行升级,发现都是一个一个参数进行传递,这样太费劲了,想了一下可以通过传递对象,这样以后修改就很方便了,说干就干,android 项目使用的 Retrofit 网络请求框架。retrofit 中有很多注解 ,但是对于 @body 网上讲解不是很多,现在我们来分析下 @body。
首先我们要明白的是后台传参数的方式最常用的分为了 get 与 post,get 的参数是跟在 url 后面的,但是 post 的参数是放在请求体里面传给后台的,但是两种方式传表单数据的话,传给后台的参数字符串是一样的,只是 get 跟在 url 后,post 放在请求体里面的,参数的形式都是以

  String=" key=xxx&key=xxx&key=xxx "


这样的方式传参的,但是还有一种就是传 json 数据,get 跟 post 都是把 json 放在 body 中传送给后台的。
retrofit 一般传表单的数据是这样的:

   @FormUrlEncoded
   @POST("xxxxxxx")
   Call<Object> login( @Field("参数1") String reason,@Field("参数2") String reason);


底层自动封装成一个请求体,并通过这个注解来把这些参数封装成一个参数字符串传给后台!

如果是传 对象的话是这样的:

  @POST("xxxxxxx")   
  Call<Object> login( @Body LoginBean login );  


与上边的区别就是没得了 @FormUrlEncoded 来标志是表单数据,并且用的 @body 里面的参数就是 java 中的 bean 对象!
这是最常用的两种方式,但是对于参数过多的表单数据按照第一种方式来写的话工程量有点大,这个时候就可以选择第二种方式来实现了。
客户端这样都写好了,可是在请求的时候服务器端却收到的都是空数据,what?

原来服务器端接收请求接口的参数应该这样:

@ResponseBody
@RequestMapping(value = {"/login"}, method = RequestMethod.POST)
public String login(@RequestBody AppUser app_User) {

}


注意这里一定要用 RequestBody 接收参数,此时就可以正常接收请求了。

这里说下 RequestBody 与 Re

一、@RequestBody 注解可以接收 json 格式的数据,并将其转换成对应的数据类型。

@ResponseBody
@RequestMapping(value = {"/login"}, method = RequestMethod.POST)
public String login(@RequestBody AppUser app_User) {

}


二、@RequestParam(org.springframework.web.bind.annotation.RequestParam)用于将指定的请求参数赋值给方法中的形参。

@RequestMapping(value="/requestParamTest", method = RequestMethod.GET)
    public String requestParamTest(@RequestParam(value="username") String userName, @RequestParam(value="usernick") String userNick){
        System.out.println("requestParam Test");
        System.out.println("username: " + userName);
        System.out.println("usernick: " + userNick);
        return "hello";
    }


三、@ModelAttribute 注解类型将参数绑定到 Model 对象
当前台界面使用 GET 或 POST 方式提交数据时,数据编码格式由请求头的 ContentType 指定。分为以下几种情况:

  1. application/x-www-form-urlencoded,这种情况的数据 @RequestParam、@ModelAttribute 可以处理,@RequestBody 也可以处理。
  2. multipart/form-data,@RequestBody 不能处理这种格式的数据。(form 表单里面有文件上传时,必须要指定 enctype 属性值为 multipart/form-data,意思是以二进制流的形式传输文件。)
  3. application/json、application/xml 等格式的数据,必须使用 @RequestBody 来处理。
@RequestMapping(value="/modelAttributeTest", method = RequestMethod.POST)
    public String modelAttributeTest(@ModelAttribute User user){
        System.out.println("modelAttribute Test");
        System.out.println("userid: " + user.getUserId());
        System.out.println("username: " + user.getUserName());
        System.out.println("userpwd: " + user.getUserPwd());
        return "hello";
    }