multipart 中的@Part 以双引号发送字符串参数

Posted

技术标签:

【中文标题】multipart 中的@Part 以双引号发送字符串参数【英文标题】:@Part in multipart sends the string parameters in double quote 【发布时间】:2018-05-04 11:26:58 【问题描述】:

以下 API 我调用了 Editing User Profile 。我必须发送用户个人资料图片,所以我在 API 中使用了 multipart 。

@Multipart
@POST(ApiURLs.EDIT_USER_PROFILE)
Call<EditProfileModel> EditUserProfile (@Part("user_id) String userId , 
@Part("user_name") String userName ,
@Part("language_id") String languageId , 
@Part("state_id") String stateId , 
@Part MultipartBody.Part 
profilePicture); 

当服务调用请求的参数会像

"user_id" : ""23"" "user_name" : ""Keval Shukla"" "language_id": ""27"" "state_id" : "53""

如何使用 MultiPart 删除双引号?

【问题讨论】:

【参考方案1】:

使用 RequestBody 代替 String。

@Part("user_id") RequestBody user_id,

叫它

String userId= "123456";
RequestBody id =
        RequestBody.create(
                okhttp3.MultipartBody.FORM, userId);

【讨论】:

【参考方案2】:

您可以将文件以外的参数发送为RequestBody

@Multipart
@POST(ApiURLs.EDIT_USER_PROFILE)
Call<EditProfileModel> EditUserProfile (@Part("user_id) RequestBody userId , 
@Part("user_name") RequestBody userName ,
@Part("language_id") RequestBody languageId , 
@Part("state_id") RequestBody stateId , 
@Part MultipartBody.Part profilePicture); 

String 转换为RequestBody

RequestBody requestBody = RequestBody.create(MediaType.parse("text/plain"), userName); // Here userName is String

【讨论】:

【参考方案3】:

你做错了,当你使用 MultiPart 作为正文类型时,你必须指定每个请求参数的正文类型。

例如,您正在发送文件(图像、视频等)和字符串参数。所以你需要指定所有参数并将其转换为特定的体型。

你需要把参数分成两部分,

1) MultipartBody - 用于媒体文件

2) RequestBody - 用于其他字符串或其他数据类型参数

例如

 /*Create API Method*/
 @Multipart
 @POST("apiurl")
 Call<Object> callMethodName(@Part("mobile_no") RequestBody mobile_no, /*String param */
                             @Part("password") RequestBody password, /*String param */
                             @Part MultipartBody.Part profile_img /*file param */);

我已将Parse类型定义为multipart/form-data,您可以根据自己的要求定义,

public static final String MULTIPART_TYPE = "multipart/form-data";

现在创建如下请求参数, /* 添加字符串参数*/ RequestBody reqNumber = RequestBody.create(MediaType.parse(Constants.MULTIPART_TYPE), number.toString()); RequestBody reqPass = RequestBody.create(MediaType.parse(Constants.MULTIPART_TYPE), pass.toString());

/* Adding File*/
File file = new File(selectedImagePath);
            RequestBody requestFile = RequestBody.create(MediaType.parse(Constants.MULTIPART_TYPE), file);
            bodyFile = MultipartBody.Part.createFormData("profile_img", file.getName(), requestFile);

作为最后一步,您需要将请求参数传递给API调用方法,如下所示,它可以识别参数并将其发送到服务器。

/* Call API Method */ 
RestClient.getApiClient().callMethodName(reqNumber, reqPass, bodyFile);

【讨论】:

【参考方案4】:

一定是这样的——

@Multipart
@POST(ApiURLs.EDIT_USER_PROFILE)
Call<EditProfileModel> EditUserProfile (
                              @Part("user_id") RequestBody userId , 
                              @Part("user_name") RequestBody userName ,
                              @Part("language_id") RequestBody languageId , 
                              @Part("state_id") RequestBody stateId , 
                              @Part RequestBody profilePicture); 

并且,要创建 requestBody

File file = new File(imageURI.getPath());
RequestBody fbody = RequestBody.create(MediaType.parse("image/*"), file); // File requestBody
RequestBody userName = RequestBody.create(MediaType.parse("text/plain"), userNameSTRING); // String requestBody

【讨论】:

以上是关于multipart 中的@Part 以双引号发送字符串参数的主要内容,如果未能解决你的问题,请参考以下文章

字符串常量必须以双引号结尾 SQL 报告

part.isMimeType == "Multipart/*" 是否有附件的意思?

Java 发送邮件是出现乱码 乱码结果如下:

kotlin android中的改造请求@Part和@Query

python中,如何去掉字串自带的引号

Python 字符串 : part 1