2016-02-20 32 views
1

步骤1: Ajax请求:无法发送JSON作为请求体弹簧控制器

$.ajax({ 
    url: "url", 
    type: "POST", 
    dataType: 'json', 
    data:{ 
    'id': '1', 
    'type': 'BOOK_VIEWED', 
    'access_token': response.response.access_token 
    }, 
    crossDomain: true, 
    success: function() { } 
}); 

步骤2执行从弹簧控制器方法之前请求 GET参数;这里有两个变种:

  • 变体1:如果我在头与content-type: json发送Ajax请求,这将工作;否则会:

    String token = request.getParameter(HEADER_SECURITY_TOKEN); 
  • 变2:如果我在报头中设置content-type: json,这将工作:

    StringBuilder sb = new StringBuilder(); 
    BufferedReader reader = request.getReader(); 
    String line; 
    while ((line = reader.readLine()) != null) 
     sb.append(line).append('\n'); 

STEP 3.春季控制器bookOpened方法应执行:

@RequestMapping(value = "/event", 
        method = RequestMethod.POST, 
         produces = MediaType.APPLICATION_JSON_VALUE) 
public void bookOpened(@RequestBody PostEvent postEvent, HttpServletRequest request) { 
    // .. 
} 

试图运行时,不执行bookOpened方法,并且引发415(unsupported media type) Exception。如果方法签名更改为仅接受:HttpServletRequest request参数(不包含@RequestBody参数),它将起作用;但这对我来说不是一个可行的解决方案。

的主要问题:

  • 在步骤2中,我想获得从请求的参数。
  • 在步骤3中,我想包括@RequestBody参数,而不仅仅是参数HttpServletRequest
+0

您是否在项目中包含了依赖项:'jackson-core'和'jackson-databin'? –

+0

你如何在**控制器之前获得params **?用拦截器或其他方式? –

回答

0

STEP 3

要强制你请求消息变换过程中,你必须指定它的内容类型。它必须是application/json。在data请求的参数你必须发送String,但不array。所以,你的要求可能看起来如下:

var post = {}; 
post['id']=1; 
post['type']='BOOK_VIEWED'; 
post['access_token']=response.response.access_token; 

$.ajax({ 
     url: 'url', 
     type: 'post', 
     contentType : 'application/json', 
     dataType:'json', 
     data:JSON.stringify(post) 
    }) 
    success: function() { ... } 
}) 

此外,包括JSON消息变换到你的项目,你必须声明一些依赖。如果您还没有这样做了,包括这依赖到你pom

<dependency> 
    <groupId>com.fasterxml.jackson.core</groupId> 
    <artifactId>jackson-core</artifactId> 
    <version>2.4.1</version> 
</dependency> 
<dependency> 
    <groupId>com.fasterxml.jackson.core</groupId> 
    <artifactId>jackson-databind</artifactId> 
    <version>2.4.1.1</version> 
</dependency> 

STEP 2

因为客户端发送请求只有一次,你可以阅读的要求只是一次体。所以,绝不要使用request.getReader(),除非在HttpMessageConverter的实现中使用它。为了从请求中获取价值,您可以将其作为请求参数(查询)发送。在你的情况下,将参数添加到URL,你必须手动编写URL字符串:

... 

$.ajax({ 
     url: 'url?acces_token='+encodeURIComponent(response.response.access_token), 
     type: 'post', 
     contentType : 'application/json', 
     dataType:'json', 
     data:JSON.stringify(post) 
    }) 
    success: function() { ... } 
}) 

之后,你可以得到请求参数与众所周知的,你的方法:

String token = URLDecoder.decode(request.getParameter('acces_token'), "utf-8"); 

不是,那在将它作为url参数传递并在服务器端获取它时再次对其进行解码之前,您已对其进行编码。

希望这会有帮助。