[英]Amdatu multi-part-form @FormParam is always null
因此,我在Felix框架內使用Amdatu創建了啟用OSGi的JSON Rest Service。
當我使用@GET時,我得到的ID值符合預期
@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("file")
public String getFile(@QueryParam("id") String id) {
System.out.println("id : "+id);
return null;
}
當我使用@POST FormParam時始終為null
@POST
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Path("file")
public String getFile(@FormParam("id") String id) {
System.out.println("id : "+id);
return null;
}
當我使用@POST但使用應用程序JSON時,我總是獲取整個原始json,而不是值。
我觀看了此視頻: http : //www.amdatu.org/howto/createwebapp.html
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Path("file")
public String getFile(String id) throws Exception {
return id
}
我正在使用適用於chrome的高級Rest Client插件來測試服務。
使用庫
org.amdatu.web.rest.jaxrs:1.0.4
org.amdatu.web.rest.wink:1.0.8
jackson-jaxrs:1.9.13
jackson-mapper-asl:1.9.13
jackson-core-asl:1.9.13
更新:
通過將它們更改為“編譯” MediaType,我可以將Maven捆綁包中的褻瀆設置為“提供”。APPLICATION_FORM_URLENCODED現在可以使用。
但是MediaType.MULTIPART_FORM_DATA仍然沒有。
在表單發布期間,我的標題是:
Content-Type: multipart/form-data
如果我刪除@FormParam,則ID填充為:
id : --ARCFormBoundary5xbnwa6as8aor
Content-Disposition: form-data; name="id"
9
--ARCFormBoundary5xbnwa6as8aor--
當我添加@FormParam時,該值為null。
JAX-RS規范沒有說明應如何處理multipart / form-data。 不同的JAX-RS實現具有自己的專有方法來處理此問題。 據我所知,Apache Wink(我們在其之上構建)不支持@FormParam的多部分功能。 Wink中似乎確實有一些支持類型: http ://wink.apache.org/documentation/1.1.1/html/7.8%20MultiPart.html,但是Amdatu Wink捆綁包並未公開這些類,而且我也從未嘗試過使用它
下面的示例是我自己使用的解決方法。 當使用multipart和其他表單字段一起上傳文件時,這很有用(這就是為什么多數使用multipart的原因)。 我使用Apache File Upload解析請求,並可以訪問上載的文件和表單字段。
@POST
@Consumes(MediaType.MULTIPART_FORM_DATA)
public void test(@Context HttpServletRequest request) {
ServletFileUpload uploader = new ServletFileUpload(new DiskFileItemFactory());
try {
List<FileItem> parseRequest = uploader.parseRequest(request);
for (FileItem fileItem : parseRequest) {
if (fileItem.isFormField()) {
System.out.println(fileItem.getFieldName() + ": "
+ fileItem.getString());
}
}
} catch (FileUploadException e) {
e.printStackTrace();
}
}
看來您在@Consumes中使用了錯誤的Mediatype。
我創建了一個示例(參見下文),該示例通過完全省略@Consumes或將其設置為MediaType.APPLICATION_FORM_URLENCODED來接受來自表單的參數。
@POST
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
public void test(@FormParam("id") String id) {
System.out.println(id);
}
HTML
<form action="/agenda" method="post">
<input type="id" name="id"/>
<input type="submit" value="Test">
</form>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.