我有一个Spring Boot服务器应用程序,它从外部服务接收具有以下特征的POST请求:
标题
接受编码:gzip,压缩
用户代理: Apache-HttpClient / 4.3.6(java 1.5)
连接:保持活动状态
主机: webhook.site
内容类型: application / x-www-form-urlencoded
内容长度: 558
查询字符串:(空)
表单值
帐单号: 41492032464
帐单值: 600000.0
说明:说明
为了能够处理来自外部服务的POST请求,我实现了以下控制器,它的作用是创建并存储发票,但是我的应用程序返回HTTP错误406:
@RequestMapping(value = "/bills", method = RequestMethod.POST, headers = "Accept=application/x-www-form-urlencoded")
@ResponseBody
@Transactional
public void createBill(UriComponentsBuilder uriComponentsBuilder, final HttpServletRequest request,
final HttpServletResponse response) throws IOException {
}
我知道错误是指客户端(在这种情况下为外部服务)不理解服务器响应的“语言”,但是正如您在控制器标头中所看到的那样,我接受“ application / x -www-form -urlencoded“我不知道是否是由于另一个问题,也是我的控制器无效
该控制器应如何在我的Spring Boot应用程序中实现?
非常感谢!
答案 0 :(得分:1)
您应将consumes
与MediaType
一起使用,以定义受支持的Content-Type
。您可以使用@PostMapping
来进一步简化:
@PostMapping(value = "/bills", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
像现在一样在响应上设置Accept
头是没有意义的,这是一个请求头。根据{{3}}:
Accept
请求HTTP标头会通告客户端能够理解的内容类型,以MIME类型表示。然后,使用内容协商,服务器选择建议之一,使用建议,并通过Content-Type
响应头将其选择通知客户端。浏览器根据完成请求的上下文为此标头设置足够的值:获取CSS样式表时,为请求设置的值与获取图像,视频或脚本时不同。