我正在构建一个小型的restlet服务,这是一个奇怪的问题。该应用程序应该在HTTP POST上响应一些XML(specifically TwiML,因为它适用于Twilio),并且它适用于独立请求。但是,当Twilio请求时,响应永远不会完成并且超时。在比较来自Twilio的流量与正在运行的流量(使用虚假的HTML表单)之后,我将问题隔离到“Connection:close”标头,并且可以使用curl命令行来重现它。以下是有效的请求:
curl -i -H 'Connection: keep-alive' -X POST -d "name=value" http://localhost:8020/hello
这是一个挂起的人:
curl -i -H 'Connection: close' -X POST -d "name=value" http://localhost:8020/hello
如果我杀了服务器,那么卷曲说“(52)从服务器清空回复”。这是我在ServerResource中使用的代码:
@Post
public Representation hello(Representation repr)
{
Representation result = new StringRepresentation(("<Response>\n"+
" <Say>Hello. This is a test.</Say>\n"+
"</Response>"), MediaType.APPLICATION_XML);
return result;
}
我在这里做的事情明显不对吗?我使用的是restlet-2.0,但也尝试了2.1m1,结果相同。我非常感谢快速回复,因为我正在完成练习的最后期限。
答案 0 :(得分:4)
不确定您是否找到了错误的解决方案,但我在Restlet V 2.0.4中遇到了同样的问题。
使用默认服务器运行restlet时。这里服务器确实假设响应流不可写,因此不会响应实体。
作为我找到的快速解决方案
org.restlet.engine.http.connector.Connection
并将canWrite()方法更改为
public boolean canWrite() {
return (
(getState() == ConnectionState.OPEN)
|| (getState() == ConnectionState.CLOSING))
&& !isOutboundBusy()
&& (getOutboundMessages().size() > 0);
}
来自原文
public boolean canWrite() {
return (getState() == ConnectionState.OPEN) && !isOutboundBusy()
&& (getOutboundMessages().size() > 0);
}
不确定这是否是一个好的修复,但重新编译restlet模块后,它现在似乎工作正常。 似乎是在指定HTTP标头'连接:关闭'时,该流默认处于关闭状态。
希望有所帮助
乔伊
请参阅此处了解有关restlet论坛的问题
http://restlet.tigris.org/ds/viewMessage.do?dsForumId=4447&dsMessageId=2698048
答案 1 :(得分:0)
不确定是不是,但需要考虑的事情:
Restlet非常仔细并准确地实现REST架构风格。它实现的关键REST原则之一是统一接口。在基于HTTP的Web服务中,统一接口以最初的方式利用HTTP GET,PUT,POST,DELETE(和其他)操作。因此,要在分配其资源名称时在服务器上创建资源,请使用PUT。要更新该资源,请再次使用PUT。要阅读它,请使用GET。要删除它,请使用DELETE。当服务器分配资源名称时,POST保留用于创建资源。
所以这可能是由于期望不匹配造成的。 POST通常具有您要发送到服务器的表示,但此POST不会。您是在阅读完整请求并在服务器端正确关闭连接?