I'm using Retrofit 2 to create a multipart form-data request which works ok and the Server responds 200. I have problems to parse the response. Here is my code:
@POST("sync/mediaUpload")
@Multipart
Call<ResponseBody> uploadMediaFile(@Header("Authorization") String token,
@Part("userId") RequestBody userId,
@Part MultipartBody.Part file,
@Part("fileId") RequestBody photoId,
@Part("hash") RequestBody hash);
public Response<ResponseBody> uploadMediaFile(String token, String userId, File file, String fileName, String fileId, String hash) {
MediaService service = retrofit.create(MediaService.class);
MultipartBody.Part fileBody = prepareFilePart("file", file);
RequestBody userIdBody = RequestBody.create(MediaType.parse("text/plain"), userId);
RequestBody fileNameBody = RequestBody.create(MediaType.parse("text/plain"), fileName);
RequestBody fileIdBody = RequestBody.create(MediaType.parse("text/plain"), fileId);
RequestBody hashBody = RequestBody.create(MediaType.parse("text/plain"), hash);
Call<ResponseBody> call = service.uploadMediaFile(token, userIdBody, txIdBody, transIdBody, stepCodeBody,
fileBody, fileNameBody, fileIdBody, hashBody);
try {
return call.execute();
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
@NonNull
private MultipartBody.Part prepareFilePart(String partName, File file) {
RequestBody requestFile = RequestBody.create(MediaType.parse("image/*"), file);
return MultipartBody.Part.createFormData(partName, file.getName(), requestFile);
}
The Server returns a Json object when the file is uploaded correctly. Example:
{
"fileName": "IMG_20190108_183751.jpg",
"fileId": "0",
"fileSizeInBytes": 216067
}
but, in call.execute(), retrofit returns:
--MultipartDataMediaFormatterBoundary1q2w3e
Content-Disposition: form-data; name="FileName"
IMG_20190108_183751.jpg
--MultipartDataMediaFormatterBoundary1q2w3e
Content-Disposition: form-data; name="FileId"
0
--MultipartDataMediaFormatterBoundary1q2w3e
Content-Disposition: form-data; name="FileSizeInBytes"
216067
How do I parse that response? I tried to change the signature of retrofit service for using an object instead of ResponseBody:
@POST("sync/mediaUpload")
@Multipart
Call<MediaUploadResponse> uploadMediaFile(@Header("Authorization") String token,
@Part("userId") RequestBody userId,
@Part MultipartBody.Part file,
@Part("fileId") RequestBody photoId,
@Part("hash") RequestBody hash);
And my Object
public class MediaUploadResponse {
public final String fileName;
public final String fileId;
public final long fileSizeInBytes;
public MediaUploadResponse(String fileName, String fileId, long
fileSizeInBytes) {
this.fileName = fileName;
this.fileId = fileId;
this.fileSizeInBytes = fileSizeInBytes;
}
}
but Retrofit throws MalformedJsonException
Does anyone have any idea how to solve this?
Thanks.