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 以双引号发送字符串参数的主要内容,如果未能解决你的问题,请参考以下文章
part.isMimeType == "Multipart/*" 是否有附件的意思?