如何使用Retrofit 2

时间:2018-02-08 09:04:45

标签: java android retrofit rx-java retrofit2

我正在使用Retrofit 2.I'am尝试实现“PATCH”方法来更新主线程上的个人资料照片。我也试过Postman.I可以更新个人资料照片。

PATCH request success

当我使用调用时,这是我的界面。另外,UpdateUser是模型w

 @PATCH("user/{username}/")
Call<User> updateUserProfile(@Path("username") String username, @Body UpdateUser User);

这是我的用户模型

public class User {

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

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

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

@SerializedName("profile_photo")
@Expose
private String profilePhoto;

public String getUsername() {
    return username;
}

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

public String getFirstName() {
    return firstName;
}

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

public String getLastName() {
    return lastName;
}

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

public String getProfilePhoto() {
    return profilePhoto;
}

public void setProfilePhoto(String profilePhoto) {
    this.profilePhoto = profilePhoto;
}

这是我在这里处理请求的ProfileUpdatePresenter

   public class ProfileUpdatePresenter
  {
  private ProfileUpdateView profileView;
  private ApiInterface apiInterface =           
  MyAPIClient.getClient().create(ApiInterface.class);

  public ProfileUpdatePresenter(ProfileUpdateView profileView) {
    this.profileView = profileView;
  }

我得到了这个方法的用户

public void getUserProfile(Activity activity, String username) {
    apiInterface.getUserProfile(username).enqueue(new CustomCallBack<User>(activity) {
        @Override
        public void onResponse(@NonNull Call<User> call, @NonNull Response<User> response) {
            super.onResponse(call,response);
            if(response.isSuccessful()) {
                profileView.onProfileGet(response.body());
            }
        }

        @Override
        public void onFailure(@NonNull Call<User> call, @NonNull Throwable t) {
            super.onFailure(call,t);
        }
    });
}

我在这里更新用户

 public void updateUserProfile(Activity activity, String Username, UpdateUser User){
    apiInterface.updateUserProfile(Username,User).enqueue(new CustomCallBack<User>(activity) {
        @Override
        public void onResponse(@NonNull Call<User> call, @NonNull Response<User> response) {
            super.onResponse(call,response);
            if(response.isSuccessful()) {
                profileView.onUpdateSucceed(response.body());
            }
        }
        @Override
        public void onFailure(@NonNull Call<User> call, @NonNull Throwable t) {
            super.onFailure(call,t);

        }
    });

在我的UpdateProfile Activity上。我通过实现My presenter的方法来获取用户。然后我也在这里更新。但是我对如何更新我的个人资料照片感到困惑。

 @Override
public void onProfileGet(@NotNull User user) {
    UserProfile = user;
    if(UserProfile.getFirstName() != null)
        et_name.setText(UserProfile.getFirstName());
    if(UserProfile.getLastName() != null)
        et_surname.setText(UserProfile.getLastName());
    if(UserProfile.getPhone() != null)
 }

我还使用接口来实现我在主线程上使用的方法

public interface ProfileUpdateView {
void onProfileGet(@NotNull User user);
void onUpdateSucceed(@NotNull User user);

}

说实话我的主要问题是如何使用我的旧@PATCH来更新个人资料照片。基本上如何在一个电话上结合这些?

@PATCH("user/{username}/")
Call<User> updateUserProfile(@Path("username") String username, @Body UpdateUser User);
   + 
@Multipart
@PATCH("/retrofit_tutorial/retrofit_client.php")
Call<ServerResponse> uploadFile(@Part MultipartBody.Part file, @Part("file") RequestBody name);

1 个答案:

答案 0 :(得分:1)

如果您可以将服务器的API修改为 @POST + Multipart ,那么您可以执行以下操作:

@Multipart
@POST("user/{username}/")
Call<User> updateUserProfile(
        @Path("username") String username,
        @Part MultipartBody.Part photo,
        @Part("json_user") String jsonUser
);

// Some Utils for request
public MultipartBody.Part fileToPart(File file) {
    return MultipartBody.Part.createFormData(
            "photo", // param name
            file.getName(),
            RequestBody.create(MediaType.parse("image/*"), file)
    );
}

// usage 
updateUserProfile("Dude", fileToPart(myFile), new Gson().toJson(myUpdateUser))