2011-05-23 65 views
26

我沒有使用JSON或類似的東西。我有一個簡單的表單上傳文件,我想讀取表單的參數。下面的代碼不能按預期工作。它不會顯示任何參數。如何使用Jersey讀取REST式服務的POST參數?

@POST 
@Consumes(MediaType.APPLICATION_FORM_URLENCODED) 
@Path("{appNum}/{docId}/file") 
public Response uploadDocFile(
     @PathParam("appNum") String appNum, 
     @PathParam("docId") String docId, 
     @Context HttpServletRequest req) 
{ 

    try { 

     log.info("POST Parameters:"); 

     Enumeration e = req.getParameterNames(); 

     while(e.hasMoreElements()) 
     { 
      Object key = e.nextElement(); 
      log.info("Key: " + key); 
      log.info("Val: " + req.getParameter(key.toString())); 
     } 


    } catch (Exception e) { 
     e.printStackTrace(); 
     return Response.status(Status.INTERNAL_SERVER_ERROR).entity(new StatusResponse(e)).build(); 
    } 

    return Response.ok().build(); 
} 
+0

形式是一個普通的HTML表單,我知道這個代碼是正確的: – 2011-05-23 12:28:54

+1

提交的PARAMS(用螢火蟲檢查) – Bozho 2011-05-23 12:30:32

+0

是的,我用wireshark驗證 – 2011-05-23 12:39:37

回答

23

僅供參考,您需要使用@FormParam。還要確保INPUT HTML類型使用name = not id =。

+0

我在我的機器上重現了這個問題。你應該仍然可以訪問HttpServletRequest(按照http://jersey.java.net/nonav/documentation/latest/user-guide.html#d4e522),我不知道爲什麼我無法。我嘗試了多個servlet容器,所以如果有人知道爲什麼會發生這種情況,我會很好奇。 – stand 2011-05-24 00:34:15

+0

因爲我在谷歌搜索時登陸這裏。我發現這個工作'公共響應doSomething(@Context HttpContext上下文)'。然後您可以使用'context'的參數來獲取請求。 – sunn0 2015-10-29 20:49:48

19

我有同樣的問題。使用@FormParam作爲個別參數的註釋工作,但從HttpServletRequest通過@Context注入它們不會。我還試圖通過Guice使用Provider<HttpServletRequest>@RequestParameters<Map<String, String[]>>來獲取請求對象/參數。在這兩種情況下都沒有後期參數。

但是,可以通過向資源方法添加MultivaluedMap<String, String>參數來獲取參數圖。例如:

@POST 
public void doSomething(MultivaluedMap<String, String> formParams) { 
//... 
} 
2

在(請求處理過程中或其他澤西對象)的時間澤西ContainerServlet一些點調用request.getInputStream()或request.getReader(),它設置 'usingInputStream' 或 'usingReader' 爲TRUE。此狀態可防止在請求對象內部填充參數映射。事情是這樣的:

parseParameters() { 
    if (usingInputStream || usingReader) { 
     return; 
    } else { 
     parametersMap.putAll({actual parameters parsing from stream}) 
    } 
} 

Map getParametersMap() { 
    return parametersMap; 
} 

嘗試把一個破發點在第一個入口點你的應用程序(澤西ServletContainer.service()方法的開始),並評估request.getParametersMap()調用。你會得到你的參數。

5

如果您在Java中使用Jersey RESTful API你可以看看Parameter Annotations (@*Param)

例子:

相關性:

<dependency> 
    <groupId>com.sun.jersey</groupId> 
    <artifactId>jersey-client</artifactId> 
    <version>1.8</version> 
</dependency> 

代碼:

package yourpack; 
import javax.ws.rs.GET; 
import javax.ws.rs.Path; 
import javax.ws.rs.PathParam; 
import javax.ws.rs.core.Response; 

@Path("/path_to_data") 
public class DataResource { 
    @GET 
    @Path("/{param}") 
    public Response getMsg(@PathParam("param") String urlparam) { 
     int ok = 200; 
     String result = "Jersey Data resource: " + urlparam; 

     return Response.status(ok).entity(result).build(); 
    } 
} 

註釋列表:@ MatrixParam@HeaderParam@CookieParam@FormParam@QueryParam@PathParam

相關問題