gpt4 book ai didi

java - 无法将 JSON 作为请求正文发送到 Spring Controller

转载 作者:太空宇宙 更新时间:2023-11-04 12:54:38 24 4
gpt4 key购买 nike

第 1 步: Ajax 请求:

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

第2步.在执行Spring Controller方法之前从请求中获取参数;这里有两个变体:

  • 变体 1:如果我发送 header 中包含 content-type: json 的 ajax 请求,这将不起作用;否则它会:

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

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

第 3 步。 应执行 Spring Controller bookOpened 方法:

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

尝试运行时,bookOpened 方法不会执行,并且会抛出 415(不支持的媒体类型)异常。如果方法签名更改为仅接受:HttpServletRequest request 参数(不带@RequestBody 参数),它将起作用;但这对我来说不是一个可行的解决方案。

主要问题:

  • 在第 2 步中,我想从请求中获取一个参数。
  • 在第 3 步中,我希望包含 @RequestBody 参数,而不仅仅是 HttpServletRequest 参数。

最佳答案

第 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>

第 2 步

由于客户端仅发送一次请求,因此您可以仅读取一次请求正文。因此,切勿使用 request.getReader(),除非在 HttpMessageConverter 实现中使用它。要从请求中获取值,您可以将其作为请求参数(查询)发送。在您的情况下,要向 url 添加参数,您必须手动编写 url-string:

...

$.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");

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

希望这会有所帮助。

关于java - 无法将 JSON 作为请求正文发送到 Spring Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35521492/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com