HTTP连接出错:关闭标头

时间:2010-12-20 03:06:35

标签: java http restlet

我正在构建一个小型的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,结果相同。我非常感谢快速回复,因为我正在完成练习的最后期限。

2 个答案:

答案 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不会。您是在阅读完整请求并在服务器端正确关闭连接?