You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android multipart/form-data请求中如何修改boundary边界值

方案1:手动构建MultipartBody指定自定义boundary

你可以放弃使用@Multipart注解自动生成Multipart结构,改为手动构建MultipartBody,直接指定带前缀连字符的boundary值:

  1. 首先修改Retrofit API接口定义,移除@Multipart注解,改用@Body传入完整MultipartBody:
// 原接口定义(示例)
// @Multipart
// @POST("你的上传路径")
// Call<你的响应类> uploadJson(@Part MultipartBody.Part uploadFile);

// 修改后的接口定义
@POST("你的上传路径")
Call<你的响应类> uploadJson(@Body MultipartBody multipartBody);
  1. 修改你的上传方法代码:
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,可以新增拦截器统一修改请求头:

  1. 自定义拦截器:
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);
    }
}
  1. 将拦截器添加到你的OkHttpClient构建逻辑中:
OkHttpClient client = new OkHttpClient.Builder()
        .addInterceptor(new BoundaryFixInterceptor())
        // 其余你的OkHttp配置(超时、其他拦截器等)
        .build();

注意:标准HTTP multipart/form-data 规范中,Content-Type头的boundary参数本身不需要带两个连字符前缀,连字符仅出现在请求体的分隔符开头。如果条件允许优先排查服务端解析逻辑是否符合规范,服务端无法修改的情况下再使用上述方案。

内容的提问来源于stack exchange,提问作者신동욱

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 13:48:04