我有两个使用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!";
}
}
当我在每台服务器上调用GET /hello
时,我得到以下回复:
第一个项目(1.3.7):状态200 (无理由)
第二个项目(1.4.0):状态200确定
这是一个错误还是我错过了什么?
此外,我无法为1.4.0项目设定理由。
答案 0 :(得分:3)
行为的改变是由使用Tomcat 8.0的Spring Boot 1.4和使用Tomcat 8.0的Spring Boot 1.3引起的。 Tomcat 8.5没有发送原因短语。
严格来说,短语不是必需的。在RFC 7230中,原因短语定义为:
reason-phrase = *( HTAB / SP / VCHAR / ons-text )
*
表示零或更多。换句话说,因为短语是空的,它是合法的。
Tomcat 8.5利用了这一点,并通过删除原因短语来节省一些带宽。如果这对您的客户造成问题,那么它可能没有规范,因为RFC已经链接到上面的RFC的这些说法:
原因 - 短语元素的存在仅仅是为了提供与数字状态代码相关联的文本描述,主要是出于对先前的Internet应用程序协议的尊重。 更常用于交互式文本客户端。客户应该 忽略原因 - 短语内容。
如果缺少原因短语导致问题,你还没有说过。如果不是,那么您最好的行动方案就是不要担心并继续前进。如果您真的想出于某种原因保留原因短语,那么切换到Undertow或Jetty是您最好的选择。
答案 1 :(得分:1)
我用假装提出了一个错误,几乎立即修复了.. 请检查https://github.com/OpenFeign/feign/issues/382
谢谢, KK
答案 2 :(得分:0)
最初,原因短语已由 Tomcat-8.5 删除。
但是,后来提供了一个修补程序,以使用 Http连接器中的属性对其进行配置。
您所要做的只是设置sendReasonPhrase="true"
属性,它将像以前一样工作。
使用以下任何一种方法进行配置:
方法1:更新 ... / apache-tomcat-8.5.x / conf / server.xml 以包括以下属性:
<Connector port="8081" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" sendReasonPhrase="true" />
方法2:通过bean配置。 (添加到配置文件中)
@Bean
public EmbeddedServletContainerFactory servletContainerFactory() {
TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory();
factory.addConnectorCustomizers(connector ->
((AbstractProtocol) connector.getProtocolHandler()).setSendReasonPhrase(true));
return factory;
}
注意::此配置将被放置在 Tomcat-9.0.x 中(即:不会发送响应消息)
参考: