Retrofit @Body 后台收到数据为空

原文:Retrofit @Body 后台收到数据为空 - 简书 (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";
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果您使用Retrofit发送POST请求@Body方式处理数据参数,可以按照以下步骤进行操作: 1. 创建一个Java类,用于存储参数。例如,如果您要向数据库添加一条用户记录,可以创建一个名为User的Java类,其属性包括用户名,密码等等。 ```java public class User { private String username; private String password; public User(String username, String password) { this.username = username; this.password = password; } public String getUsername() { return username; } public String getPassword() { return password; } } ``` 2. 在Retrofit接口中定义POST请求,使用@Body注解将User对象作为请求体发送到服务器。 ```java public interface ApiService { @POST("users") Call<Void> createUser(@Body User user); } ``` 3. 在应用中使用Retrofit对象创建接口实例,并调用createUser方法。 ```java // 创建Retrofit对象 Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://example.com/api/") .addConverterFactory(GsonConverterFactory.create()) .build(); // 创建接口实例 ApiService apiService = retrofit.create(ApiService.class); // 创建User对象 User user = new User("username", "password"); // 发送POST请求 Call<Void> call = apiService.createUser(user); call.enqueue(new Callback<Void>() { @Override public void onResponse(Call<Void> call, Response<Void> response) { // 请求成功 } @Override public void onFailure(Call<Void> call, Throwable t) { // 请求失败 } }); ``` 上述代码将向服务器发送一条POST请求,将User对象作为请求体发送到服务器。如果请求成功,服务器将会将User对象存储到数据库中。如果请求失败,将会调用onFailure方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值