Я могу загрузить файл, используя чистый код ohttp, но не могу воспроизвести его, используя retrofit2, я не хочу вводить учетные данные, потому что это не требуется в случае okhttp, поэтому не должно быть здесь, так какхорошо (я предполагаю).Ниже приведен мой okhttp-код.
val client = OkHttpClient()
val file = File(pathOfFileToSend)
val requestFile = okhttp3.RequestBody.create(okhttp3.MediaType.parse("image/jpeg"), file)
val body = MultipartBody.Builder()
for (field in mS3Params!!.post_params!!.fields) {
body.addFormDataPart(field.name ?: "", field.value ?: "")
}
body.addPart(Headers.of("Content-Disposition", "form-data; name=\"file\""),requestFile)
val request = Request.Builder()
.url(BuildConfig.S3_IMAGE_SERVER_URL)
.post(body.build())
.build()
val response = client.newCall(request).execute()
if (!response.isSuccessful) {
//Success
} else {
//Fail
}
Этот код работает отлично.Я также поделился моими mS3Params для справки.
class S3ImageParamsResponseModel {
var action: String? = null
var card_id: String? = null
var image_url: String? = null
var post_params: PostParams? = null
class PostParams {
lateinit var fields: List<Field>
override fun toString(): String {
return "PostParams{" +
"fields=" + fields +
'}'.toString()
}
}
class Field {
var name: String? = null
var value: String? = null
override fun toString(): String {
return "Field{" +
"name='" + name + '\''.toString() +
", value='" + value + '\''.toString() +
'}'.toString()
}
}
override fun toString(): String {
return "S3ImageParamsResponseModel{" +
"action='" + action + '\''.toString() +
", card_id='" + card_id + '\''.toString() +
", image_url='" + image_url + '\''.toString() +
", post_params=" + post_params!!.toString() +
'}'.toString()
}
Теперь я не могу преобразовать вышеуказанное в запрос retrofit2 / rxjava.Мой код всегда дает 405 исключений.Вот два испытания.
Испытание 1 -
val file = File(pathOfFileToSend)
Timber.d(TAG, "onRun: length=" + file.length())
val descriptionPart = RequestBody.create(MultipartBody.FORM, "imageFile")
val requestFile = RequestBody.create(MediaType.parse("image/jpeg"), file)
val filePart = MultipartBody.Part.createFormData("photo", "imageFile",
requestFile)
val httpClient = OkHttpClient.Builder()
httpClient.addNetworkInterceptor(StethoInterceptor())
val client = httpClient.build()
val retrofit = Retrofit.Builder()
.baseUrl(BuildConfig.S3_IMAGE_SERVER_URL)
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.client(client)
.build()
val uploadService = retrofit.create(FreshClient::class.java)
val uploads = uploadService.uploadFile(mS3Params!!.image_url!!,
descriptionPart, filePart)
uploads.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(object : DisposableObserver<ResponseBody>() {
override fun onComplete() {
}
override fun onError(e: Throwable) {
Timber.d("", "")
}
override fun onNext(uploadData: ResponseBody) {
Timber.d("", "")
}
})
Испытание 2 -
val file = File(pathOfFileToSend)
Timber.d(TAG, "onRun: length=" + file.length())
val descriptionPart = RequestBody.create(MultipartBody.FORM, "imageFile")
val requestFile = RequestBody.create(MediaType.parse("image/jpeg"), file)
val body = MultipartBody.Builder()
for (field in mS3Params!!.post_params!!.fields) {
body.addFormDataPart(field.name ?: "", field.value ?: "")
}
body.addPart(
Headers.of("Content-Disposition", "form-data; name=\"file\""),
requestFile)
val httpClient = OkHttpClient.Builder()
httpClient.addNetworkInterceptor(StethoInterceptor())
val client = httpClient.build()
val retrofit = Retrofit.Builder()
.baseUrl(BuildConfig.S3_IMAGE_SERVER_URL)
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.client(client)
.build()
val uploadService = retrofit.create(FreshClient::class.java)
val uploads = uploadService.uploadFile(mS3Params!!.image_url!!,
descriptionPart, body.build().part(0))
uploads.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(object : DisposableObserver<ResponseBody>() {
override fun onComplete() {
}
override fun onError(e: Throwable) {
Timber.d("", "")
}
override fun onNext(uploadData: ResponseBody) {
Timber.d("", "")
}
})
И мое обслуживание в обоих случаях следующее -
@Multipart
@POST("")
fun uploadFile(@Url url: String,
@Part("description") description: RequestBody,
@Part file: MultipartBody.Part): Observable<ResponseBody>
Пожалуйста, помогите, как преобразовать рабочий код ohttp в retrofit2 / rxjava.