在改造中将表单数据发送到服务器 [英] Send Form data to server in Retrofit

查看:93
本文介绍了在改造中将表单数据发送到服务器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

试图通过翻新将表单数据发送到服务器,但无法请求到服务器.我想发布一个包含其数据的图像数组.

Trying to send form data to the server via Retrofit but unable to request to the server. I want to post an image array with their data.

 val builder: MultipartBody.Builder  =  MultipartBody.Builder().setType(MultipartBody.FORM);
            builder.addFormDataPart("device_id",device_UDID)
            builder.addFormDataPart("device_token",device_token)
            builder.addFormDataPart("device_type","android")
            builder.addFormDataPart("country_code",Constant.COUNTRY_CODE)
            builder.addFormDataPart("email",signUpBean.email)
            builder.addFormDataPart("mobile",signUpBean.phoneNumber)
            builder.addFormDataPart("first_name",signUpBean.firstName)
            builder.addFormDataPart("last_name",signUpBean.lastName)
            builder.addFormDataPart("gender",signUpBean.gender)
            builder.addFormDataPart("dob",signUpBean.dob)
            builder.addFormDataPart("city",signUpBean.city)
            builder.addFormDataPart("bike_type_id","1")
            builder.addFormDataPart("bike_model",signUpBean.mfg)
            builder.addFormDataPart("bike_manufacturer",signUpBean.mfg)
            builder.addFormDataPart("reg_year",signUpBean.mfgYear)
            builder.addFormDataPart("liecense_plate",signUpBean.licencePlateNo)
            builder.addFormDataPart("bank_ac_name",signUpBean.bnkHolderName)
            builder.addFormDataPart("bank_ac_number",signUpBean.bnkAccountNumber)
            builder.addFormDataPart("bank_name",signUpBean.bnkName)
            builder.addFormDataPart("bank_ifsc_code",signUpBean.ifscCode)
            builder.addFormDataPart("profile_pic","profile" + ".jpg", RequestBody.create(MediaType.parse("image/*"), file_profile!!))
            builder.addFormDataPart("provider_documents[0][document]","1" + ".jpg", RequestBody.create(MediaType.parse("image/*"), file_profile!!))
            builder.addFormDataPart("provider_documents[0][document_id]","1")
            builder.addFormDataPart("provider_documents[0][unique_id]","1")
            builder.addFormDataPart("provider_documents[0][exprice_at]","2010-12-12")
            val requestBody = builder.build()
                 observable = apiInterface.signUp2(requestBody)

我尝试了许多解决方案,但无法发布包含其数据的图像阵列. 当我从addFormDataPart中删除provider_documents时,它工作正常.

I have tried many solutions but unable to post an image array with their data. When i remove provider_documents from addFormDataPart it works fine.

// @Multipart
    @POST(URLHelper.register)
    fun signUp2(@Body builder: RequestBody ): Observable<Registration>

如何发送Providers_document数组,并且在Postman上工作正常.

How can I send Providers_document array and it is working fine on Postman.

从改造中发布此类数据

post this type of data from retrofit

   val partMap = HashMap<String, RequestBody>()
            partMap.put("device_id", createPartFromString(device_UDID));
            partMap.put("device_token",createPartFromString(device_token))
            partMap.put("device_type",createPartFromString("android"))
            partMap.put("country_code",createPartFromString(Constant.COUNTRY_CODE))
            partMap.put("email",createPartFromString(signUpBean.email))
            partMap.put("mobile",createPartFromString(signUpBean.phoneNumber))
            partMap.put("first_name",createPartFromString(signUpBean.firstName))
            partMap.put("last_name",createPartFromString(signUpBean.lastName))
            partMap.put("gender",createPartFromString(signUpBean.gender))
            partMap.put("dob",createPartFromString(signUpBean.dob))
            partMap.put("city",createPartFromString(signUpBean.city))
            partMap.put("bike_type_id",createPartFromString("1"))
            partMap.put("bike_model",createPartFromString(signUpBean.mfg))
            partMap.put("bike_manufacturer",createPartFromString(signUpBean.mfg))
            partMap.put("reg_year",createPartFromString(signUpBean.mfgYear))
            partMap.put("liecense_plate",createPartFromString(signUpBean.licencePlateNo))
            partMap.put("bank_ac_name",createPartFromString(signUpBean.bnkHolderName))
            partMap.put("bank_ac_number",createPartFromString(signUpBean.bnkAccountNumber))
            partMap.put("bank_name",createPartFromString(signUpBean.bnkName))
            partMap.put("bank_ifsc_code",createPartFromString(signUpBean.ifscCode))

            partMap.put("provider_documents["+0+"][document_id]",createPartFromString(signUpBean.ifscCode))
            partMap.put("provider_documents["+0+"][unique_id]",createPartFromString(signUpBean.ifscCode))
            partMap.put("provider_documents["+0+"][exprice_at]",createPartFromString(signUpBean.dob))

            val ImageMap = HashMap<String, MultipartBody.Part>()
            ImageMap.put("profile_pic", prepareFilePart("12", file_profile!!));
            ImageMap.put("provider_documents["+0+"][document]", prepareFilePart("1", file_profile!!));

请求Api

   @Multipart
    @POST(URLHelper.register)
    fun signUp3(@PartMap photo: HashMap<String, RequestBody>,
                @PartMap ImageMap:HashMap<MultipartBody.Part>,

     ): Observable<Registration>

推荐答案

虚拟api接口.

 public interface ApiInterface {
        @Multipart
        @POST(URLHelper.register)
        Call<ModelProp> signUp2(@Part List<MultipartBody.Part> photos,
                          @PartMap Map<String, RequestBody> map;
    }

现在创建要发布的数据.

Now create data to post like this.

Map<String, RequestBody> partMap = new HashMap<>();
List<MultipartBody.Part> images = new ArrayList<>();
partMap.put("device_id", createPartFromString(deviceId)); // add data which are common for all images like device_id, device_token, device_type etc.
..
..

for (int i=0; i < upFileList.size(); i++){
   images.add(prepareFilePart("provider_documents["+i+"][document]", imageFile));
   partMap.add("provider_documents["+i+"][expires_at]", createPartFromString(expiry)); // add image specific data. 
 ...
 ..
}
...
..
observable = apiInterface.signUp2(images, partMap).

createPartFromString 方法

public RequestBody createPartFromString(String string) {
        return RequestBody.create(MultipartBody.FORM, string);
}

prepareFilePart 方法

private MultipartBody.Part prepareFilePart(String partName, File file){
    RequestBody requestBody = RequestBody.create(MediaType.parse("image/*"), file);

    return MultipartBody.Part.createFormData(partName, file.getName(),requestBody);
}

这篇关于在改造中将表单数据发送到服务器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆