使用Retrofit2

时间:2016-03-30 10:24:09

标签: android retrofit retrofit2

我曾经使用 Retrofit2

向服务器发送POST请求
    @POST("goals")
    Call<Void> postGoal(@Body Goal goal);

其中,Goal是一些String / Integer字段的对象。

现在我需要在那里添加照片文件。 我知道我需要切换才能使用 Multipart

    @Multipart
    @POST("goals")
    Call<Void> postGoal(
            @Part("picture") RequestBody picture
            );

//...
//Instantaining picture 
RequestBody.create(MediaType.parse("image/*"), path)

但是我应该如何添加以前的字段呢?特别是有没有办法添加整个Goal对象而不将其划分为字段?

2 个答案:

答案 0 :(得分:0)

您可以像这样添加@Part目标

@Multipart
    @POST("goals")
    Call<Void> postGoal(
            @Part("picture") RequestBody picture,
            @Part("goal") RequestBody goal
            );

    //...
    //Instantaining picture 
    RequestBody.create(MediaType.parse("image/*"), path)

您可以找到更多详细信息:retrofit-2-how-to-upload-files-to-server

答案 1 :(得分:0)

发送json和文件你可以遵循这样的事情。

@Multipart
@POST("goals")
Call<JsonModel> postGoal(@Part MultipartBody.Part file, @Part("json") RequestBody json);

现在使用Gson将您想要作为json发送的对象转换为json。 像这样。

    String json = new Gson().toJson(new Goal());

  File file = new File(path);
                        RequestBody requestFile =
                                RequestBody.create(MediaType.parse("multipart/form-data"), file);

                        // MultipartBody.Part is used to send also the actual file name
                        MultipartBody.Part body =
                                MultipartBody.Part.createFormData("picture", file.getName(), requestFile);

                        // add another part within the multipart request
                        RequestBody jsonBody=
                                RequestBody.create(
                                        MediaType.parse("multipart/form-data"), json);
                        Retrofit retrofit = new Retrofit.Builder()
                                .baseUrl(url)
                                .addConverterFactory(GsonConverterFactory.create())
                                .build();
                        RestApi api = retrofit.create(RestApi.class);
                        Call<ResponseBody> call = api.upload(jsonBody, body);
                        call.enqueue(new Callback<ResponseBody>() {
                            @Override
                            public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                                Log.d("onResponse: ", "success");
                            }

                            @Override
                            public void onFailure(Call<ResponseBody> call, Throwable t) {
                                Log.d("onFailure: ", t.getLocalizedMessage());
                            }
                        });