【问题标题】:My Spring Boot server returns 406 Http error code我的 Spring Boot 服务器返回 406 Http 错误代码
【发布时间】:2018-11-16 12:44:20
【问题描述】:

我有一个 Spring Boot 服务器应用程序,它从具有以下特征的外部服务接收 POST 请求:

标题

accept-encoding: gzip,deflate
user-agent: Apache-HttpClient/4.3.6 (java 1.5)
connection: Keep-Alive
host: webhook.site
content-type: application/x-www-form-urlencoded
content-length: 558
Query strings: (empty)

表单值

BillNumber: 41492032464
BillValue: 600000.0
Description: Description

为了能够处理来自外部服务的这个 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 应用中实现?

【问题讨论】:

  • 不,这意味着服务器无法生成客户端要求的内容。您正在混淆 Accept(这是我想要返回的内容)和 Content-Type(这是我要发送的内容)标头。

标签: java spring spring-boot


【解决方案1】:

您应该使用consumesMediaType 来定义支持的Content-Type。您可以使用@PostMapping 进一步简化:

@PostMapping(value = "/bills", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)

像现在这样在响应上设置Accept 标头是没有意义的,这是一个请求标头。根据Mozilla docs

Accept 请求 HTTP 标头通告客户端能够理解的以 MIME 类型表示的内容类型。使用内容协商,服务器然后选择其中一个建议,使用它并使用Content-Type 响应标头通知客户端其选择。浏览器根据完成请求的上下文为此标头设置足够的值:获取 CSS 样式表时,为请求设置的值与获取图像、视频或脚本时不同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-21
    • 2013-07-05
    • 1970-01-01
    • 2018-02-13
    • 2020-10-07
    • 1970-01-01
    相关资源
    最近更新 更多