2016-06-02 2 views
0

Apache CXFを使用してWeb APIを作成しました。私は、POSTメソッドで)(HttpServletRequest.getParamterを使用する場合、それはnull.Hereコードで返します。ここではHttpServletRequest.getParamter()CXFでnullを返す快適なサービス(投稿)

@Path("/") 
public class TokenService extends DigiwinBaseService { 

    private static void printRequest(HttpServletRequest httpRequest) { 
     System.out.println("\n\n Headers"); 
     Enumeration headerNames = httpRequest.getHeaderNames(); 
     while (headerNames.hasMoreElements()) { 
      String headerName = (String) headerNames.nextElement(); 
      System.out.println(headerName + " = " + httpRequest.getHeader(headerName)); 
     } 
     System.out.println("\n\n Parameters"); 
     Enumeration params = httpRequest.getParameterNames(); 
     while (params.hasMoreElements()) { 
      String paramName = (String) params.nextElement(); 
      System.out.println(paramName + " = " + httpRequest.getParameter(paramName)); 
     } 
     System.out.println("\n\n Row data"); 
     System.out.println(extractPostRequestBody(httpRequest)); 
    } 

    private static String extractPostRequestBody(HttpServletRequest request) { 
     if ("POST".equalsIgnoreCase(request.getMethod())) { 
      Scanner s = null; 
      try { 
       s = new Scanner(request.getInputStream(), "UTF-8").useDelimiter("\\A"); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      return s.hasNext() ? s.next() : "null"; 
     } 
     return "null"; 
    } 

    @POST 
    @Consumes("application/x-www-form-urlencoded") 
    public Response Authorize(@FormParam("param") String param, 
      @FormParam("param2") String param2,@Context HttpServletRequest httpRequest) throws OAuthSystemException { 
     printRequest(httpRequest); 
     System.out.println("param:"+param); 
     System.out.println("param2:"+param2);  
     return Response.status(HttpServletResponse.SC_OK).entity("OK").build();  
    } 
} 

は、テストコードはここ

public class HttpClientTest { 

     public static void main(String[] args) throws Exception{ 

      String url4 = "/api/services/Test"; 
      String host = "127.0.0.1"; 
      HttpClient httpClient = new HttpClient(); 
      httpClient.getHostConfiguration().setHost(host, 8080, "http"); 
      HttpMethod method = postMethod(url4); 
      httpClient.executeMethod(method);  
      String response = method.getResponseBodyAsString(); 
      System.out.println(response); 
     } 

     private static HttpMethod postMethod(String url) throws IOException{ 
      PostMethod post = new PostMethod(url); 
      post.setRequestHeader("Content-Type","application/x-www-form-urlencoded;charset=gbk"); 
      NameValuePair[] param = { 
        new NameValuePair("param","param1"), 
        new NameValuePair("param2","param2"),} ; 
      post.setRequestBody(param); 
      post.releaseConnection(); 
      return post; 
     } 
    } 

でプリントアウトです:

Headers 
content-type = application/x-www-form-urlencoded;charset=gbk 
user-agent = Jakarta Commons-HttpClient/3.1 
host = 127.0.0.1:8080 
content-length = 26 

Parameters 

Row data 
null 

param:param1 
param2:param2 

なぜパラメータがnullですか? HttpServletRequest.getParamter()を使用してポストパラメータを取得する方法

+0

を使用します1つを作ったの? – EJP

答えて

2

CXFがFormParamsを満たすためにPOSTデータを消費しています。

https://issues.apache.org/jira/browse/CXF-2993

解像度はを "修正されません" です。問題では、彼らはすべてのparamsを回復するためにMultivaluedMapを使用することをお勧め、または唯一のHttpServletRequest

オプション1

@POST 
@Consumes("application/x-www-form-urlencoded") 
public Response Authorize(MultivaluedMap<String, String> parameterMap, @Context HttpServletRequest httpRequest) throws OAuthSystemException { 
    //parameterMap has your POST parameters 

オプションあなたがあなたの前に `releaseConnection`を呼び出しているのはなぜ2

@POST 
@Consumes("application/x-www-form-urlencoded") 
public Response Authorize(@Context HttpServletRequest httpRequest) throws OAuthSystemException { 
    //httpRequest.getParameterMap() has your POST parameters 
関連する問題