是否可以使用改装将单个项目作为multipart传递?

时间:2017-03-24 11:52:27

标签: android retrofit multipart

 @Multipart
@POST("/api/add-deal/")
public void addDeal(@Body Deal deal, @Part("image")TypedFile image,Callback<Response> callback);

我想只将图像作为多部分发送,其余部分按原样发送。有可能吗?即使我尝试在我的Deal模型中添加TypedFile但无法使用@part

进行注释

3 个答案:

答案 0 :(得分:2)

是的,使用哈希映射可以使用Partmap注释。例如 -

    @Multipart
    @POST("/api/add-deal/")
    Call<Response> addDeal(@PartMap 
    HashMap<String, RequestBody> hashMap);

在hashMap中,您可以不添加url参数作为键,并使用RequestBody类类型设置值。了解如何将String和Image转换为RequestBody。

    public static RequestBody ImageToRequestBody(File file) { //for image file to request body
           return RequestBody.create(MediaType.parse("image/*"),file);
    }

    public static RequestBody StringToRequestBody(String string){ // for string to request body
           return RequestBody.create(MediaType.parse("text/plain"),string);
    }

将参数添加到hashmap -

    hashMap.put("photo",ImageToRequestBody(imageFile)); //your imageFile to Request body.
    hashMap.put("user_id",StringToRequestBody("113"));
    //calling addDeal method
    apiInterface.addDeal(hashMap);

希望这有用。

答案 1 :(得分:0)

您似乎可以将@Body作为TypedString发送 例如,将“@Body Deal deal”转换为JSON String,并将其作为TypedString发送。

详细信息:How to send multipart/form-data with Retrofit?

@Multipart
@POST("/api/v1/articles/")
Observable<Response> uploadFile(@Part("author") TypedString authorString,
                                @Part("photo") TypedFile photoFile);

答案 2 :(得分:0)

这对我有用:POST Multipart Form Data using Retrofit 2.0 including image

public interface ApiInterface {
@Multipart
@POST("/api/Accounts/editaccount")
Call<User> editUser (@Header("Authorization") String authorization, @Part("file\"; filename=\"pp.png\" ") RequestBody file , @Part("FirstName") RequestBody fname, @Part("Id") RequestBody id);
}

File file = new File(imageUri.getPath());
RequestBody fbody = RequestBody.create(MediaType.parse("image/*"), file);
RequestBody name = RequestBody.create(MediaType.parse("text/plain"), firstNameField.getText().toString());
RequestBody id = RequestBody.create(MediaType.parse("text/plain"), AZUtils.getUserId(this));
Call<User> call = client.editUser(AZUtils.getToken(this), fbody, name, id);
call.enqueue(new Callback<User>() {
@Override
public void onResponse(retrofit.Response<User> response, Retrofit retrofit) {
    AZUtils.printObject(response.body());
}

@Override
public void onFailure(Throwable t) {
    t.printStackTrace();
}
});