Spring Boot 1.4.0:REST 控制器未将原因设置为 HTTP 响应

Nic*_*las 2 java spring spring-mvc spring-boot

我有 2 个使用 Spring Tool Suite“Spring Starter Project”创建的项目:

第一个项目: Spring Boot 1.3.7(发布)+ Web

第二个项目: Spring Boot 1.4.0(发布)+ Web

@SpringBootApplication用以下代码替换每个项目的类:

@SpringBootApplication
@RestController
public class TestWebApplication {

    public static void main(String[] args) {
        SpringApplication.run(TestWebApplication.class, args);
    }

    @RequestMapping("/hello")
    public String sayHello() {
        return "hello!";
    }
}
Run Code Online (Sandbox Code Playgroud)

当我调用GET /hello每个服务器时,我得到以下响应:

第一个项目 (1.3.7):状态 200 (无原因)

第二个项目(1.4.0):状态 200 OK

这是一个错误还是我错过了什么?

此外,我无法为 1.4.0 项目设置原因。

And*_*son 5

行为的变化是由于使用 Tomcat 8.5 的 Spring Boot 1.4 和使用 Tomcat 8.0 的 Spring Boot 1.3 造成的。Tomcat 8.5 不发送原因短语。

严格来说,原因短语不是必需的。在RFC 7230中,原因短语定义为:

reason-phrase  = *( HTAB / SP / VCHAR / ons-text )
Run Code Online (Sandbox Code Playgroud)

其中*表示零个或多个。换句话说,原因短语为空是合法的。

Tomcat 8.5 利用了这一点,并通过删除原因短语来节省一些带宽。如果这给您的客户带来了问题,那么它可能不符合规范,因为上面链接的 RFC 部分是这样说的:

Reason-phrase 元素存在的唯一目的是提供与数字状态代码相关的文本描述,主要是出于对更频繁地与交互式文本客户端一起使用的早期 Internet 应用程序协议的尊重。客户端应该忽略原因短语内容。

您还没有说缺少原因短语是否会导致问题。如果不是,那么你最好的做法就是不要担心并继续前进。如果您确实想出于某种原因保留原因短语,那么切换到 Undertow 或 Jetty 是您最好的选择。