2016-10-22 119 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 –

相关问题