使用Jersey 2发送multipart/form-data文件请求报错400,Postman与cUrl可正常执行
问题原因
你的代码存在两处核心错误,导致服务端无法正常解析multipart/form-data请求:
- FormDataMultiPart构造逻辑错误,手动拆分FileDataBodyPart导致文件字段和配置没有正确绑定,服务端识别不到
file参数,反而将文件名解析为了独立的非法参数 - 最后请求时的媒体类型配置错误,若
mediatype(MediaType.APPLICATION_JSON)是设置请求Content-Type,会直接覆盖你Entity中指定的multipart类型,导致请求格式完全错误
同时需要确认Jersey客户端已经注册了Multipart相关组件,否则也会出现序列化异常。
修复方案
第一步:确认Jersey客户端注册MultiPartFeature
构造客户端时必须注册Multipart支持组件,示例如下:
ClientConfig clientConfig = new ClientConfig(); clientConfig.register(MultiPartFeature.class); Client client = ClientBuilder.newClient(clientConfig);
第二步:修正业务代码
FlexRESTClient restClient = getClient(); restClient.path("/rest/v13/migrationPackages/actions/import"); final File fileToUpload = new File("C:/temp/fdplugins/work/1/1/artifacts/Project1/Project1/TestPackage1_5.zip"); FormDataMultiPart form = new FormDataMultiPart(); // 直接添加FileDataBodyPart即可,不需要手动拆分配置 form.bodyPart(new FileDataBodyPart("file", fileToUpload, MediaType.APPLICATION_OCTET_STREAM_TYPE)); Entity<FormDataMultiPart> entity = Entity.entity(form, MediaType.MULTIPART_FORM_DATA_TYPE); // 明确设置Accept头为JSON,不要覆盖请求的Content-Type FlexRESTClientResponse clientResponse = restClient.setValidateResponse(true) .accept(MediaType.APPLICATION_JSON) .post(entity);
内容的提问来源于stack exchange,提问作者jbrouillard
相关产品推荐
相关产品推荐

