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

如何使用Retrofit发送含嵌套结构的Multipart请求?

如何发起包含图片和嵌套JSON结构的Multipart请求

我来帮你搞定这个嵌套Multipart请求的问题!核心思路很简单:在Multipart表单里,我们把嵌套的JSON结构作为普通文本字段提交(字段名对应你JSON里的键,值是该嵌套结构的JSON字符串),同时单独添加文件字段来上传图片就行。


一、用Postman快速验证请求

这是最快的测试方式,步骤一目了然:

  1. 新建POST请求,填入你的接口URL
  2. 切换到Body标签,选择form-data类型
  3. 逐个添加以下字段:
    • emailId:文本类型,值填vision.jav@avenger.com
    • phoneNumber:文本类型,值填7417385811
    • profileImage:文件类型,选择本地的图片文件
    • password:文本类型,值填12345678
    • customerDetails:文本类型,值填{"firstName": "vison", "lastName": "vision"}(注意是完整的JSON字符串)
    • addressDetails:文本类型,值填{"city": "chicago", "province": "NY", "postalCode": "654987", "latitude": "28.52", "longitude": "77.54"}
    • userRole:文本类型,填你示例里截断的角色值(比如USER)
  4. 点击Send就能发起符合要求的请求了

二、代码实现示例

1. Java(OkHttp库)

如果是Java项目,用OkHttp实现很方便:

import okhttp3.*;
import java.io.File;
import java.io.IOException;

public class MultipartRequestDemo {
    public static void main(String[] args) throws IOException {
        OkHttpClient client = new OkHttpClient();

        // 先把嵌套结构转成JSON字符串
        String customerJson = "{\"firstName\": \"vison\", \"lastName\": \"vision\"}";
        String addressJson = "{\"city\": \"chicago\", \"province\": \"NY\", \"postalCode\": \"654987\", \"latitude\": \"28.52\", \"longitude\": \"77.54\"}";

        // 构建Multipart请求体
        RequestBody requestBody = new MultipartBody.Builder()
                .setType(MultipartBody.FORM)
                .addFormDataPart("emailId", "vision.jav@avenger.com")
                .addFormDataPart("phoneNumber", "7417385811")
                // 上传图片,注意匹配文件的MediaType
                .addFormDataPart("profileImage", "avatar.jpg",
                        RequestBody.create(new File("/你的图片路径/avatar.jpg"), MediaType.parse("image/jpeg")))
                .addFormDataPart("password", "12345678")
                .addFormDataPart("customerDetails", customerJson)
                .addFormDataPart("addressDetails", addressJson)
                .addFormDataPart("userRole", "USER")
                .build();

        Request request = new Request.Builder()
                .url("https://你的接口地址.com/user/register") // 替换成实际接口URL
                .post(requestBody)
                .build();

        try (Response response = client.newCall(request).execute()) {
            System.out.println("接口响应:" + response.body().string());
        }
    }
}

2. Python(requests库)

Python实现更简洁,requests库会帮我们处理很多细节:

import requests
import json

url = "https://你的接口地址.com/user/register"

# 表单文本字段,嵌套结构转成JSON字符串
form_data = {
    "emailId": "vision.jav@avenger.com",
    "phoneNumber": "7417385811",
    "password": "12345678",
    "customerDetails": json.dumps({"firstName": "vison", "lastName": "vision"}),
    "addressDetails": json.dumps({"city": "chicago", "province": "NY", "postalCode": "654987", "latitude": "28.52", "longitude": "77.54"}),
    "userRole": "USER"
}

# 图片文件,注意文件路径要正确
files = {
    "profileImage": open("/你的图片路径/avatar.jpg", "rb")
}

# 发送请求
response = requests.post(url, data=form_data, files=files)
print("接口响应:", response.text)

三、关键注意事项

  • 嵌套的JSON字段必须转成字符串提交,不能直接传对象,否则Multipart表单会解析失败
  • 图片字段的MediaType要和你上传的图片类型匹配(比如image/png对应PNG图,image/jpeg对应JPG图)
  • 如果后端用Spring Boot接收,文件字段可以用@RequestParam("profileImage") MultipartFile profileImage接收,嵌套字段用@RequestParam("customerDetails") String customerDetails接收后,再自己反序列化成实体类就行

内容的提问来源于stack exchange,提问作者Kumar Raj

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:57:14