Sam*_*bit 61 java multipartform-data jax-rs jersey postman
我想通过上传图像和员工数据来在系统中创建员工信息.我能够使用球衣进行不同的休息呼叫.但我希望在一次休息电话中实现.我提供下面的结构.请帮我解决这方面的问题.
@POST
@Path("/upload2")
@Consumes({MediaType.MULTIPART_FORM_DATA,MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public Response uploadFileWithData(
@FormDataParam("file") InputStream fileInputStream,
@FormDataParam("file") FormDataContentDisposition contentDispositionHeader,
Employee emp) {
//..... business login
}
Run Code Online (Sandbox Code Playgroud)
每当我想要做的时候,我都会在Chrome邮递员中出错.我的Employee json的简单结构如下所示.
{
"Name": "John",
"Age": 23,
"Email": "john@gmail.com",
"Adrs": {
"DoorNo": "12-A",
"Street": "Street-11",
"City": "Bangalore",
"Country": "Karnataka"
}
}
Run Code Online (Sandbox Code Playgroud)
但是我可以通过进行两次不同的调用来实现,但我希望在一次休息调用中实现,这样我就可以接收文件以及员工的实际数据.
请求您在这方面提供帮助.
Pau*_*tha 93
你不能拥有两个Content-Type
(从技术上来说,这就是我们在下面所做的,但它们与多部分的每个部分分开,但主要类型是多部分).这基本上是你对你的方法所期望的.您期望将mutlipart 和 json一起作为主要媒体类型.该Employee
数据需要多部分的一部分.所以,你可以添加@FormDataParam("emp")
的Employee
.
@FormDataParam("emp") Employee emp) { ...
Run Code Online (Sandbox Code Playgroud)
这是我用于测试的类
@Path("/multipart")
public class MultipartResource {
@POST
@Path("/upload2")
@Consumes({MediaType.MULTIPART_FORM_DATA})
public Response uploadFileWithData(
@FormDataParam("file") InputStream fileInputStream,
@FormDataParam("file") FormDataContentDisposition cdh,
@FormDataParam("emp") Employee emp) throws Exception{
Image img = ImageIO.read(fileInputStream);
JOptionPane.showMessageDialog(null, new JLabel(new ImageIcon(img)));
System.out.println(cdh.getName());
System.out.println(emp);
return Response.ok("Cool Tools!").build();
}
}
Run Code Online (Sandbox Code Playgroud)
首先,我刚用客户端API测试,以确保它的工作原理
@Test
public void testGetIt() throws Exception {
final Client client = ClientBuilder.newBuilder()
.register(MultiPartFeature.class)
.build();
WebTarget t = client.target(Main.BASE_URI).path("multipart").path("upload2");
FileDataBodyPart filePart = new FileDataBodyPart("file",
new File("stackoverflow.png"));
// UPDATE: just tested again, and the below code is not needed.
// It's redundant. Using the FileDataBodyPart already sets the
// Content-Disposition information
filePart.setContentDisposition(
FormDataContentDisposition.name("file")
.fileName("stackoverflow.png").build());
String empPartJson
= "{"
+ " \"id\": 1234,"
+ " \"name\": \"Peeskillet\""
+ "}";
MultiPart multipartEntity = new FormDataMultiPart()
.field("emp", empPartJson, MediaType.APPLICATION_JSON_TYPE)
.bodyPart(filePart);
Response response = t.request().post(
Entity.entity(multipartEntity, multipartEntity.getMediaType()));
System.out.println(response.getStatus());
System.out.println(response.readEntity(String.class));
response.close();
}
Run Code Online (Sandbox Code Playgroud)
我刚刚创建了一个Employee
带有id
and name
字段的简单类来进行测试.这完全没问题.它显示图像,打印内容配置,并打印Employee
对象.
我对Postman不太熟悉,所以我保存了最后的测试:-)
它似乎工作正常,因为你可以看到响应"Cool Tools"
.但是如果我们查看打印Employee
数据,我们会发现它是空的.这很奇怪,因为客户端API工作得很好.
如果我们查看预览窗口,我们会看到问题所在
身体部位没有Content-Type
头部emp
.您可以在客户端API中看到我明确设置它
MultiPart multipartEntity = new FormDataMultiPart()
.field("emp", empPartJson, MediaType.APPLICATION_JSON_TYPE)
.bodyPart(filePart);
Run Code Online (Sandbox Code Playgroud)
所以我想这只是完整答案的一部分.就像我说的那样,我对Postman不熟悉所以我不知道如何设置Content-Type
个人身体部位.在image/png
对图像进行自动为我设置的图像部分(我猜它只是由文件扩展名确定).如果你能解决这个问题,那么问题就应该解决了.如果您发现如何操作,请将其作为答案发布.
基本配置:
相关性:
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-multipart</artifactId>
<version>${jersey2.version}</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
客户端配置:
final Client client = ClientBuilder.newBuilder()
.register(MultiPartFeature.class)
.build();
Run Code Online (Sandbox Code Playgroud)
服务器配置:
// Create JAX-RS application.
final Application application = new ResourceConfig()
.packages("org.glassfish.jersey.examples.multipart")
.register(MultiPartFeature.class);
Run Code Online (Sandbox Code Playgroud)
从Postman客户端可以看出,一些客户端在使用FormData
(js)时无法设置单个部件的Content-Type,包括浏览器的默认功能.
我们不能指望客户找到这个,所以我们可以做的是,在接收数据时,在反序列化之前显式设置Content-Type.例如
@POST
@Path("upload2")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response uploadFileAndJSON(@FormDataParam("emp") FormDataBodyPart jsonPart,
@FormDataParam("file") FormDataBodyPart bodyPart) {
jsonPart.setMediaType(MediaType.APPLICATION_JSON_TYPE);
Employee emp = jsonPart.getValueAs(Employee.class);
}
Run Code Online (Sandbox Code Playgroud)
获得POJO需要额外的工作,但这比强迫客户尝试找到自己的解决方案更好.
归档时间: |
|
查看次数: |
87759 次 |
最近记录: |