Android multipart/form-data请求中如何修改boundary边界值
方案1:手动构建MultipartBody指定自定义boundary
你可以放弃使用@Multipart注解自动生成Multipart结构,改为手动构建MultipartBody,直接指定带前缀连字符的boundary值:
- 首先修改Retrofit API接口定义,移除
@Multipart注解,改用@Body传入完整MultipartBody:
// 原接口定义(示例) // @Multipart // @POST("你的上传路径") // Call<你的响应类> uploadJson(@Part MultipartBody.Part uploadFile); // 修改后的接口定义 @POST("你的上传路径") Call<你的响应类> uploadJson(@Body MultipartBody multipartBody);
- 修改你的上传方法代码:
private void jsonUpload(String json) { json=json.replace("\\",""); byte[] file = new byte[0]; try { file = json.getBytes("UTF_8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } RequestBody requestFile = RequestBody.create(file); // 自定义boundary,前面加两个连字符满足要求 String customBoundary = "--custom_boundary_123456"; MultipartBody multipartBody = new MultipartBody.Builder(customBoundary) .setType(MultipartBody.FORM) .addFormDataPart("resourceInfoList", "blob", requestFile) .build(); AifricaRetrofitTool.getAPIWithHeader().uploadJson(multipartBody) .enqueue(RetrofitTool.getCallback(new UploadJsonRequestCallback())); }
方案2:添加OkHttp拦截器统一修改Content-Type头
如果你需要全局处理所有Multipart请求的boundary,可以新增拦截器统一修改请求头:
- 自定义拦截器:
public class BoundaryFixInterceptor implements Interceptor { @Override public Response intercept(Chain chain) throws IOException { Request originRequest = chain.request(); RequestBody body = originRequest.body(); if (body instanceof MultipartBody && body.contentType() != null) { String originContentType = body.contentType().toString(); if (originContentType.contains("boundary=")) { // 提取原有boundary值 String originBoundary = originContentType.split("boundary=")[1]; // 给boundary添加两个连字符前缀 String newContentType = originContentType.replace(originBoundary, "--" + originBoundary); // 生成新请求替换头 return chain.proceed(originRequest.newBuilder() .header("Content-Type", newContentType) .build()); } } return chain.proceed(originRequest); } }
- 将拦截器添加到你的OkHttpClient构建逻辑中:
OkHttpClient client = new OkHttpClient.Builder() .addInterceptor(new BoundaryFixInterceptor()) // 其余你的OkHttp配置(超时、其他拦截器等) .build();
注意:标准HTTP
multipart/form-data规范中,Content-Type头的boundary参数本身不需要带两个连字符前缀,连字符仅出现在请求体的分隔符开头。如果条件允许优先排查服务端解析逻辑是否符合规范,服务端无法修改的情况下再使用上述方案。
内容的提问来源于stack exchange,提问作者신동욱
相关产品推荐
相关产品推荐

