2016-10-22 104 views
1
private ArrayList<NameValuePair> mParams; 
HttpClient client = new DefaultHttpClient(); 

mParams = new ArrayList<NameValuePair>(); 
mParams.add(new BasicNameValuePair("testKey", "John")); 
mParams.add(new BasicNameValuePair("testSerial", "003-100")); 
HttpPost request = new HttpPost("http://localhost:8080/test/getRequiredEnv"); 

request.setEntity(new UrlEncodedFormEntity(mParams, HTTP.UTF_8)); 
HttpResponse response = client.execute(request); 

// TestController.java如何在Spring MVC控制器中獲取HttpRequest getEntity數據?

@RestController 
public class TestController { 

private static final Logger logger = Logger.getLogger(TestController.class); 

@RequestMapping(value = "/getRequiredEnv", method = RequestMethod.POST) 
public @ResponseBody ResponseInfo getRequiredEnv(
       @RequestParam("testKey") String testKey, 
       @RequestParam("testValue") String testValue, 
       @RequestHeader HttpHeaders headers) { 

    logger.info("Test Key [" + testKey + "]"); 
    logger.info("Test Value [" + testValue + "]"); 

    return new TestResponseInfo("0001", "ABC"); 
} 

是否有人可以告訴我這是用SpringMVC中休息控制器擺脫「Request.setEntity」數據的正確方法或者我失去了一些東西?

其次,在postman「httpPost」請求中,我將參數(testKey & testValue)作爲標頭或身體?

第三,在不知道httpPost請求中的參數的情況下,我是否可以解析傳入請求並從Spring控制器中提取參數?

回答

0

首先最好知道發送的請求的內容類型。

所以我想你想得到請求的正文。爲了讓所有的參數,如果你不知道的參數名稱預先可以使用@RequestParamMap<String, String>類型得到所有PARAMS:

@RequestMapping(value = "/getRequiredEnv", method = RequestMethod.POST) 
public @ResponseBody ResponseInfo getRequiredEnv(
      @RequestParam Map<String, String> allParams, 
      @RequestHeader HttpHeaders headers) 

但我不知道,如果這個工程,因爲它也取決於內容 - 類型。例如。對於表格數據(application/x-www-form-urlencoded)看看Spring文檔約@RequestBody其中規定默認消息轉換FormHttpMessageConverter約之一:

FormHttpMessageConverter從MultiValueMap形式數據變換爲/。

所以嘗試:

@RequestMapping(value = "/getRequiredEnv", method = RequestMethod.POST) 
public @ResponseBody ResponseInfo getRequiredEnv(
      @RequestBody MultiValueMap<String, String>, 
      @RequestHeader HttpHeaders headers) 

另外還有HttpServletRequest.getParameterMap()它讓你的地圖。您可以通過包含HttpServletRequest request作爲方法參數來獲取請求。

如果你知道paramters事前,標註你的POJO類似於與@ModelAttribute表單數據也應該像這樣:

@RequestMapping(value = "/getRequiredEnv", method = RequestMethod.POST) 
public @ResponseBody ResponseInfo getRequiredEnv(
     @@ModelAttribute Test myTestPojo, 
     @RequestHeader HttpHeaders headers) 

或者你也可以發送數據的應用程序/ JSON和包括傑克遜的時依賴關係,@Requestbody會將您的數據映射到POJO。看看例如Spring JSON request body not mapped to Java POJO

關於您的第二個問題,httpPost會將參數作爲主體傳遞,因爲它是POST請求。

+0

感謝@dudel的細節闡述。你能告訴我有沒有什麼辦法可以簡單地打印客戶發送的RAW請求/數據而不需要知道參數或其他東西? –

+0

在這種情況下,您可以使用'HttpServletRequest'中的'getInputStream()'或'getReader()',但請注意只能讀一次。 – dudel

+0

完美。我們可以稍後閱讀請求/數據,如下所述鏈接? http://stackoverflow.com/questions/10457963/spring-rest-service-retrieving-json-from-request –

相關問題