2016-06-07 4 views
2

을 나는 MultiPartrequest OkHttp 작업 한 :개조 2.0 다중

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에 있지만 작업 솔루션을 찾지 못했습니다. 도와주세요.

답변

4

나는 또한 이런 종류의 요청을하는 데 많은 어려움을 겪었습니다.

@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; 
} 
+1

감사 : 나는 이미지 또는 동영상을 업로드하려면이 옵션을 사용하게. 그냥 몇 가지 주제에 대한 답변을 찾았습니다. –