【问题标题】:Exclude some fields from JSON Body in POST request using Retrofit Android使用 Retrofit Android 从 POST 请求中的 JSON 正文中排除一些字段
【发布时间】:2018-03-20 09:51:18
【问题描述】:

我正在使用 Retrofit2 向我的服务器发送和接收请求。

这是我的 API 接口和模型类。

  1. 界面

    public interface ApiInterface {
    
       @POST("/users/")
       Call<User> signUp(@Body User user);
    
       @POST("/login_url/")
       Call<User> login(@Body User user);
    }
    
  2. 改造客户端

    public class RetrofitClient {
    
       private static Retrofit retrofit = null;
    
       public static Retrofit getRestClient(String baseUrl) {
           if (retrofit == null) {
               retrofit = new Retrofit.Builder().baseUrl(baseUrl)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
           }
           return retrofit;
       }
    }
    
  3. POJO 类

    public class User {
    
        @SerializedName("id")
        private Integer id;
    
        @SerializedName("email")
        @Expose
        private String email;
    
        @SerializedName("first_name")
        private String firstName;
    
        @SerializedName("last_name")
        private String lastName;
    
        @SerializedName("password")
        @Expose
        private String password;
    }
    

我已经公开了电子邮件和密码,以便在登录请求中添加这两个参数。 但是对于像注册这样的另一个请求,我还需要将名字和姓氏连同电子邮件和密码一起发送。

我可以为两者使用相同的“用户”类吗?因为如果我暴露了名字和姓氏,那么这些字段也会在登录请求中发送。

还有其他方法或者我应该为这两个请求创建不同的 POJO 类吗?

【问题讨论】:

  • 为什么不只发送参数?
  • 意思是我需要通过我自己的添加作为参数来准备JSON对象吗?

标签: android retrofit retrofit2 gson


【解决方案1】:

您可以使用 @Field 注释代替发送整个类,因此您的登录回调将是这样的:

@FormUrlEncoded    
@POST("/login_url/")
Call<User> login(@field("email")String email,@field("password")String password);

@FormUrlEncoded 表示请求正文将使用表单 URL 编码。字段应声明为参数并使用 @Field 进行注释。

【讨论】:

  • 这会将请求正文转换为带有请求中添加的字段的 JSON 吗?
  • 如果我正在使用的模型有很多要包含的字段,而只有少数要排除的字段,那么这项工作就太多了
  • @zulkarnainshah 此时您可以在添加模型类作为参数之前使用 @Body 注释,这将更有助于选择包含/排除哪些字段。
【解决方案2】:

我可以为两者使用相同的"User" 类吗?

是的,对于这两个请求,您可以使用与 @Body 相同的 Model !

只要确定你不需要required variables 的地方就省略它们!!

删除 @SerializedName 和 @Expose ,这些不是必需的,并根据 json KEYs

给出 variable names
public class User {

   private Integer id;

   private String email;

   private String firstName;

   private String lastName;

   private String password;

}

编辑

例如,假设您需要一个请求:-

  • 你设置模型用户的4个参数

     new User(id,email,firstname,lastname); // dont init the password attribute
    
  • 5 参数你将所有值设置为model 之类的

     new User(id,email,firstname,lastname,password);
    

【讨论】:

  • 但是我怎么能省略呢?例如,Login API 需要 2 个参数,Sign up API 需要 4 个普通模型类的参数。
  • 我已经更新了答案请检查编辑@KhushbuShah
猜你喜欢
  • 2018-09-22
  • 1970-01-01
  • 2017-05-30
  • 2017-11-18
  • 2017-12-03
  • 2023-04-10
  • 2016-09-24
  • 1970-01-01
  • 2016-12-26
相关资源
最近更新 更多