【问题标题】:Retrofit 2.0 multipart改造 2.0 多部分
【发布时间】:2016-06-07 14:10:46
【问题描述】:

我有工作 OkHttp MultiPart request

multi = new MultipartBody.Builder()
                .setType(MultipartBody.FORM)
                .addFormDataPart("email", m)
                .addFormDataPart("password", p)
                .addFormDataPart("user_name", n)
                .addFormDataPart("user_phone", phone)
                .addFormDataPart("photo", "avatar.jpg", RequestBody.create(MediaType.parse("image/jpg"), imgToArray(bmpChosenPic)))
                //.addFormDataPart("photo", "1")
                .build();
        request = new Request.Builder()
                .url(Utils.TEST_BASE_URL + "" + REG_URL)
                .post(multi)
                .build();
        client.newCall(request).enqueue(new Callback()...

现在我尝试使用Retrofit 2.0 实现相同的功能。这是服务:

@Multipart
@POST("/api/v1/auth/register")
Call<Registration>  registration (@Part("email") RequestBody email,
                                  @Part("password") RequestBody password,
                                  @Part("user_name") RequestBody userName,
                                  @Part("photo") RequestBody url,
                                  @Part("phone") RequestBody phone);

所以根据这个interface我试着做一个Call

  RequestBody photoR = RequestBody.create(MediaType.parse("image/jpg"), imgToArray(bmp));
    RequestBody nameR = RequestBody.create(MediaType.parse("text/plain"), name);
    RequestBody emailR = RequestBody.create(MediaType.parse("text/plain"), email);
    RequestBody passR = RequestBody.create(MediaType.parse("text/plain"), pass);
    RequestBody phone = RequestBody.create(MediaType.parse("text/plain"), "");
    RegistaionI service = ServiceGenerator.createService(RegistaionI.class);
    retrofit2.Call<Registration> call = service.registration(
            emailR,
            passR,
            nameR,
            photoR,
            phone);
    call.enqueue(new retrofit2.Callback<Registration>() {
        @Override
        public void onResponse(retrofit2.Call<Registration> call, retrofit2.Response<Registration> response) {
            RegistrationData data = response.body().getData();
            System.out.println(data.getId());
        }

        @Override
        public void onFailure(retrofit2.Call<Registration> call, Throwable t) {

        }
    });

但是,不幸的是,我在这一行得到了 NPE:

 RegistrationData data = response.body().getData();

所以我想,我的代码有问题。我已经阅读了有关 SOF 和 GitHub 的 Retrofit 分支的相关主题,但没有找到有效的解决方案。请帮忙。

【问题讨论】:

    标签: android multipartform-data retrofit2


    【解决方案1】:

    我在提出这种要求时也遇到了很多麻烦。我最终使用它来上传图片或视频:

    @Multipart
    @POST(Constants.URL_UPLOAD)
    Call<ResponseBody> upload(@PartMap Map<String, RequestBody> params);
    

    以及方法API调用

    private String uploadFile(String path, final String type) throws IOException, JSONException {
    
        Map<String, RequestBody> map = new HashMap<>();
        map.put("Id", Utils.toRequestBody("0"));
        map.put("Name", Utils.toRequestBody("example"));
        String types = path.substring((path.length() - 3), (path.length()));
    
        if (path != null) {
            File file2 = new File(path);
            RequestBody fileBody = RequestBody.create(MediaType.parse(type), file2);
            map.put("file\"; filename=\"cobalt." + types + "\"", fileBody);
        }
    
        Call<ResponseBody> call = cobaltServices.upload(map);
        ResponseBody response = call.execute().body();
    
        return RESULT_OK;
    }
    

    【讨论】:

    • 谢谢。刚刚在某个主题中找到了您的答案。
    猜你喜欢
    • 1970-01-01
    • 2019-01-07
    • 1970-01-01
    • 2018-05-04
    • 2019-03-28
    • 1970-01-01
    • 1970-01-01
    • 2018-04-15
    • 2015-11-29
    相关资源
    最近更新 更多