我希望使用CURL命令在dropwizard上测试我的REST资源。我可以上传文件并获取内容和文件名。但随着文件我想传递一些ID列表。
CURL命令
curl -F 'file=@/cygdrive/c/TestDocument1.txt' http://localhost:8199/test-app/api/upload-documents/1004/documents
上传文件的REST服务
@POST
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Path("/reconciliation-details/{reconciliationDetailId}/documents")
public Response uploadDocument(@FormDataParam("file") File inventoryDocumentContent,
@FormDataParam("file") FormDataContentDisposition fileDetail,
@FormDataParam("reconciliationIds") List<Long> reconciliationIds) throws Exception {
byte[] documentContent = FileUtils.readFileToByteArray(inventoryDocumentContent);
String documentName = fileDetail.getFileName();
reconDetailsService.uploadDocument(documentName, documentContent, reconciliationIds);
return ResponseHelper.createOkResponse();
}
答案 0 :(得分:0)
您需要将内容类型设置为application / json。但是-d发送了Content-Type application / x-www-form-urlencoded,这在Spring方面是不被接受的。
查看curl手册页,我认为你可以使用-H:
-H "Content-Type: application/json"
完整示例:
curl -H "Content-Type: application/json" -X POST -d '{"username":"xyz","password":"xyz"}' http://localhost:3000/api/login
( - H代表--header,-d代表--data。)
对于带文件的Json
curl -i -X POST -H "Content-Type: multipart/mixed" -F "blob=@/Users/username/Documents/bio.jpg" -F "metadata={\"edipi\":123456789,\"firstName\":\"John\",\"lastName\":\"Smith\",\"email\":\"john.smith@gmail.com\"};type=application/json" http://localhost:8080/api/v1/user/
答案 1 :(得分:0)
使用multipart,每个部分都可以拥有自己的Content-Type标头。默认情况下,如果未指定,则使用text/plain
。某些客户端无法为单个部件as mentioned in this post设置内容类型(其中提到了解决方案),但cURL具有此功能。您只需附加;type=<content-type>
即可。例如
-F "reconciliationIds=[1, 2, 3, 4];type=application/json"
您可以使用包含JSON
的文件,而不是使用实际的JSON数组-F "reconciliationIds=@path-to-json;type=application/json"
Jersey将看到此部分的Content-Type是application / json并使用它通常用于JSON的反序列化器
请务必查看上面的链接帖子 - 即使这可能有效,您也不希望将用户限制为仅使用具有此功能的客户端。帖子的底部为您提供了解决方案,但我没有使用List<Long>
进行测试。我不确定如何使用getEntityAs(Class)
,因为您无法传递通用Long
类型。您总是可以将其包装在POJO中而不是仅使用列表。