1

我在java中使用Restlet作为一个简单的客户端来调用由tastepie(python django)提供的RESTful服务

我正在通过 tcpmon 监控有效负载,我看到以下有效负载被返回,但是我无法获取有效负载中的数据。

客户来电

ClientResource resource = new ClientResource("http://localhost/someplace/");
String rep = resource.get(String.class);

有效载荷

HTTP/1.0 200 OK
Date: Thu, 12 Jul 2012 20:22:12 GMT
Server: WSGIServer/0.1 Python/2.7.1
Vary: Cookie
Content-Type: application/json; charset=utf-8
Set-Cookie:  sessionid=63c5ea23113073e489cb8920819f37d; expires=Thu, 26-Jul-2012 20:22:12 GMT;           httponly; Max-Age=1209600; Path=/

{"jsonData": "someData"}

当我调试到 restlet 时,我注意到 InboundWay.createEntity(..) 由于缺少长度、块编码或连接标头而将数据设置为 EmptyRepresentation。为什么是这样?为什么我不能只流式传输数据?

有谁知道为什么会这样?有更好的客户吗?到目前为止,尝试了球衣和 Resteasy 并取得了有限的成功。(jeresy 有一个错误,它试图标记和重置 autoCloseSteam,而 resteasy 只是作为客户端使用很痛苦)我希望不必编写 HTTPClient。

做了更多的挖掘,在我看来,RESTLET 正在做一些非常愚蠢的事情。

它正在查看响应标头并尝试查找它是否知道大小,或者是否知道它的 chunkedEncoding,或者是否指定了 Connection:closed。否则它不会尝试解析有效​​负载......有谁知道这是为什么?我没有意识到以任何方式都需要这些标题。为什么我们不能在未指定连接关闭时使用 ClosingInputStream...

Restlet 代码

public Representation createInboundEntity(Series<Parameter> headers) {
        Representation result = null;
        long contentLength = HeaderUtils.getContentLength(headers);
        boolean chunkedEncoding = HeaderUtils.isChunkedEncoding(headers);
        // In some cases there is an entity without a content-length header
        boolean connectionClosed = HeaderUtils.isConnectionClose(headers);

        // Create the representation
        if ((contentLength != Representation.UNKNOWN_SIZE && contentLength != 0)
                || chunkedEncoding || connectionClosed) {
            InputStream inboundEntityStream = getInboundEntityStream(
                    contentLength, chunkedEncoding);
            ReadableByteChannel inboundEntityChannel = getInboundEntityChannel(
                    contentLength, chunkedEncoding);
...
4

0 回答 0