Как отправить данные вместе с файлом в Retrofit Android - PullRequest
1 голос
/ 12 февраля 2020

Я отправляю некоторые данные на сервер одним файлом, ниже мой код

val fileReqBody = pwdFile.asRequestBody("*/*".toMediaTypeOrNull())
        val part = MultipartBody.Part.createFormData("pwdfile", pwdFile.name, fileReqBody)

        var registerDataService = RetrofitInstance.buildService(RegisterDataService::class.java)

        var call: Call<Object> = registerDataService.registerAccount(
            userName, email, firstName,
            lastName, srpSyncPass, deviceId,
            deviceType, deviceName, pubKey, part
        )

        call.enqueue(object : Callback<Object> {
            override fun onResponse(call: Call<Object>, response: Response<Object>) {
                Log.v("retrofit", call.toString() + ", " + response.body())

            }

            override fun onFailure(call: Call<Object>?, t: Throwable?) {
                Log.v("retrofit", "call failed")

            }

        })

Мой код RegisterDataService ниже

interface RegisterDataService {

    @Multipart
    @POST("user/account/")
    fun registerAccount(@Part("username") username: String,
                        @Part("email") email: String,
                        @Part("firstname") firstName: String,
                        @Part("lastname") lastName: String,
                        @Part("srppass") srppass: String,
                        @Part("deviceid") deviceId: String,
                        @Part("devicetype") deviceType: Int,
                        @Part("devicename") deviceName: String,
                        @Part("pubkey") pubKey: String,
                        @Part pwdFile: MultipartBody.Part): Call<Object>

}

Я не получаю правильный результат

Но то же самое в почтальоне работает нормально, как на скриншоте ниже.

enter image description here

Почтальон работает нормально, кто-нибудь может мне помочь, где я делаю ошибка?

Файл, который я отправляю с Multipart.

Ответы [ 2 ]

1 голос
/ 12 февраля 2020

используйте это:

 @Multipart
   @POST("api/events/")
   Observable<Event> postEvent(

           @Part("name") RequestBody name,
           @Part("description") RequestBody description,    
   );

and request body,
 RequestBody requestBodyName = RequestBody.create(text, name);
 RequestBody requestBodyDescription = RequestBody.create(text, description);

then,
  return apiService.postEvent(requestBodyName,requestBodyDescription);
1 голос
/ 12 февраля 2020

Наконец я сделал это следующим образом

val requestUserName = userName.toRequestBody("multipart/form-data".toMediaTypeOrNull())
val requestEmail = email.toRequestBody("multipart/form-data".toMediaTypeOrNull())
val requestFirstName = firstName.toRequestBody("multipart/form-data".toMediaTypeOrNull())
val requestLastName = lastName.toRequestBody("multipart/form-data".toMediaTypeOrNull())
val requestSyncPass = srpSyncPass.toRequestBody("multipart/form-data".toMediaTypeOrNull())
val requestDeviceId = deviceId.toRequestBody("multipart/form-data".toMediaTypeOrNull())
val requestDeviceName = deviceName.toRequestBody("multipart/form-data".toMediaTypeOrNull())
val requestPubKey = pubKey.toRequestBody("multipart/form-data".toMediaTypeOrNull())

В RegisterDataService

@Multipart
    @POST("user/account/")
    fun registerAccount(@Part("username") username: RequestBody,
                        @Part("email") email: RequestBody,
                        @Part("firstname") firstName: RequestBody,
                        @Part("lastname") lastName: RequestBody,
                        @Part("srppass") srppass: RequestBody,
                        @Part("deviceid") deviceId: RequestBody,
                        @Part("devicetype") deviceType: Int,
                        @Part("devicename") deviceName: RequestBody,
                        @Part("pubkey") pubKey: RequestBody,
                        @Part pwdFile: MultipartBody.Part): Call<Object>

Теперь все работает нормально.

...