之前使用Restlet 2.0.15版本写的REST接口,在测试时,使用浏览器和Java httpclient进行请求均可以正常获取到响应。
但上线一段时间后,有一个用户却反馈他调用任何接口均无法获取到响应。
我用他提供的一个URL在浏览器中直接访问(GET请求),可以正常获取到数据,于是我便在服务端抓包查找原因。
原来,用浏览器或者Java httpclient进行请求时,请求报文均是keep alive状态,收到接口响应后,变为Close wait状态,而无法获取响应的用户的请求报文为close状态,也就是TCP短连接,Restlet 2.0.15版本在该情况下会导致客户端无法获取到响应。
由于客户端坚持使用短连接方式,因此只能在服务端想办法。
好在Restlet官方给出了解决方案,升级到2.3.7版本后,只需在pom.xml中加入jetty依赖即可。
<dependency>
<groupId>org.restlet.jse</groupId>
<artifactId>org.restlet.ext.jetty</artifactId>
<version>2.3.7</version>
</dependency>
等待maven更新完成,重启REST服务,客户端短连接请求也能够正确收到响应了。