如何使用Retrofit发送含嵌套结构的Multipart请求?
如何发起包含图片和嵌套JSON结构的Multipart请求
我来帮你搞定这个嵌套Multipart请求的问题!核心思路很简单:在Multipart表单里,我们把嵌套的JSON结构作为普通文本字段提交(字段名对应你JSON里的键,值是该嵌套结构的JSON字符串),同时单独添加文件字段来上传图片就行。
一、用Postman快速验证请求
这是最快的测试方式,步骤一目了然:
- 新建POST请求,填入你的接口URL
- 切换到
Body标签,选择form-data类型 - 逐个添加以下字段:
emailId:文本类型,值填vision.jav@avenger.comphoneNumber:文本类型,值填7417385811profileImage:文件类型,选择本地的图片文件password:文本类型,值填12345678customerDetails:文本类型,值填{"firstName": "vison", "lastName": "vision"}(注意是完整的JSON字符串)addressDetails:文本类型,值填{"city": "chicago", "province": "NY", "postalCode": "654987", "latitude": "28.52", "longitude": "77.54"}userRole:文本类型,填你示例里截断的角色值(比如USER)
- 点击
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
相关产品推荐
相关产品推荐

