使用Retrofit Android

时间:2018-03-20 09:51:19

标签: android retrofit retrofit2 gson

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

以下是我的API接口和Model类。

  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;
    }
    
  4. 我已经公开了电子邮件和密码,因此在登录请求中将添加这两个参数。 但是对于像注册这样的另一个请求,我还需要一个名字和姓氏以及电子邮件和密码。

    我可以使用相同的&#34;用户&#34;两个班级?因为如果我公开了名字和姓氏,那么这些字段也将在登录请求中发送。

    还有其他方法或者我应该为这两个请求制作不同的POJO课程吗?

2 个答案:

答案 0 :(得分:2)

您可以使用 @Field 注释,而不是发送整个班级,因此您的登录回调将是这样的:

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

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

答案 1 :(得分:0)

  

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

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

只需确保您不需要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);