如何在retrofit2中为post / put请求添加密钥

时间:2018-02-10 12:03:42

标签: android retrofit retrofit2

我是新手进行改造,我想知道是否有更好的方法可以在发出/发布请求时获得此结果:

"user": {
    "owner_id": 1,
    "first_name": "test",
    "middle_name": "test2",
    "last_name": "test3"
    ...
}

现在为了获得这个,我有这个模型:

public class User implements Serializable {

    @SerializedName("id")
    @Expose
    private int id;

    @SerializedName("owner_id")
    @Expose private int ownerId;

    @SerializedName("first_name")
    @Expose private String firstName;

    @SerializedName("middle_name")
    @Expose private String middleName;

    @SerializedName("last_name")
    @Expose private String lastName;

    @SerializedName("username")
    @Expose private String username;

    @SerializedName("email")
    @Expose private String email;

    @SerializedName("password")
    @Expose private String password;

    @SerializedName("api_token")
    @Expose private String apiToken;

    @SerializedName("settings")
    @Expose private UserSettings settings;

    @SerializedName("active")
    @Expose private int active;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getOwnerId() {
        return ownerId;
    }

    public void setOwnerId(int ownerId) {
        this.ownerId = ownerId;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getMiddleName() {
        return middleName;
    }

    public void setMiddleName(String middleName) {
        this.middleName = middleName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getApiToken() {
        return apiToken;
    }

    public void setApiToken(String apiToken) {
        this.apiToken = apiToken;
    }

    public UserSettings getSettings() {
        return settings;
    }

    public void setSettings(UserSettings settings) {
        this.settings = settings;
    }

    public int getActive() {
        return active;
    }

    public void setActive(int active) {
        this.active = active;
    }
}

我将它包装在另一个中:

public class UserRequest implements Serializable {

    @SerializedName("user")
    @Expose private User user;

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }
}

我的请求格式:

@PUT(BuildConfig.BASE_API_VERSION + "main/users/user-details")
    Call<ResponseBody> putUserDetails(@Body UserRequest userDetailsRequest);

我不认为这是完成工作的最佳方法,对于一个对象请求有2个类似乎有点乏味。 谢谢大家的时间!

2 个答案:

答案 0 :(得分:0)

您可以使用自定义JsonSerializer来实现这一目标:

gsonBuilder.registerTypeAdapter(User.class, new UserSerializer());

Gson customGson = gsonBuilder.create();  // use this instance for your Retrofit service.
Retrofit retrofit = new Retrofit.Builder()  
     .baseUrl(...)
     .addConverterFactory(GsonConverterFactory.create(customGson))
     .build();

class UserSerializer implements JsonSerializer<User> { 
    @Override
    public JsonElement serialize(User src, Type typeOfSrc, JsonSerializationContext context) {
        JsonObject userJson = new JsonObject();

        userJson("user", context.serialize(src));

        return userJson;
    }
};

虽然需要更多配置。

答案 1 :(得分:0)

我最终创建了一张我在@Body中发送的地图,如下所示:

//Create a map for the query params 
        Map<String, User> queryParams = new HashMap<>();
        queryParams.put("user_details", userDetails);

        final Call<BaseResponseModel<User>> res = apiService.putUserDetails(queryParams);

        res.enqueue(new Callback<BaseResponseModel<User>>() {
            @Override
            public void onResponse(Call<BaseResponseModel<User>> call, retrofit2.Response<BaseResponseModel<User>> response) {
                if (response.isSuccessful() && response.body().isSuccess()){
                    //manipulate the response data
                    back.onResponse(call, response);
                }
                else {

                    back.onFailure(call, null);
                }
            }

            @Override
            public void onFailure(Call<BaseResponseModel<User>> call, Throwable t) {
                back.onFailure(null, t);
            }
        });

我的请求格式:

@PUT(BuildConfig.BASE_API_VERSION + "main/users/user-details")
    Call<BaseResponseModel<User>> putUserDetails(@Body Map<String, User> params);

模型保持不变,请求如下所示:

"user": {
    "owner_id": 1,
    "first_name": "test",
    "middle_name": "test2",
    "last_name": "test3"
    ...
}