Restlent不会向部分请求返回任何内容

时间:2013-10-29 13:26:04

标签: java ipad curl restlet

我使用restlet构建REST-API来提供mp3文件。但是文件是同时创建和提供的。关于here的更多信息。

它工作得很好,但我只是在桌面环境中测试过。当我启动我的iPad来测试API时,它开始播放文件,但几秒钟后它停止,发送一个新的请求并从头开​​始播放文件。

在一些研究人员之后,我发现iPad发送了部分请求,因此需要部分响应。

所以我修改了Response-Header以满足要求。

我使用curl来测试API:

curl -v -r 0-1 http://localhost:12345/api/path/file.mp3

请求标题

GET /api/path/file.mp3 HTTP/1.1
Range: bytes=0-1
User-Agent: curl/7.22.0 (x86_64-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3
Host: localhost:12345
Accept: */*

响应头

HTTP/1.1 206 Partial Content
Date: Tue, 29 Oct 2013 12:18:11 GMT
Accept-Ranges: bytes
Server: Restlet-Framework/2.1.0
Vary: Accept-Charset, Accept-Encoding, Accept-Language, Accept
Content-Length: 2
Content-Range: bytes 0-1/19601021
Content-Type: audio/mpeg; charset=UTF-8
Expires: Tue, 29 Oct 2013 12:18:07 GMT
Last-Modified: Tue, 29 Oct 2013 12:18:07 GMT 

错误-消息

但是没有从服务器返回的数据。 Curl保持连接对服务器开放,iPad发送新请求。 当我关闭服务器时curl给了我:

transfer closed with 1 bytes remaining to read
Closing connection #0
curl: (18) transfer closed with 1 bytes remaining to read

代码

这是我用来返回数据的代码。如您所见,此方法仅用于测试,应始终返回2个字节。

private InputRepresentation rangeGetRequest() throws IOException {

    final byte[] bytes = new byte[2];
    bytes[0] = 68;
    bytes[1] = 68;

    final InputRepresentation inputRepresentation = new InputRepresentation(new ByteArrayInputStream(bytes), MediaType.AUDIO_MPEG);

    return inputRepresentation;

}

我不知道该怎么做。我尝试编写自己的InputStream,返回2个字节,但没有成功。 或者InputRepresentation不适合这个应用领域?

提前致谢

1 个答案:

答案 0 :(得分:0)

好的,我解决了这个问题,这是一个愚蠢的错误。

要修改响应标头,我使用了

getResponse().setEntity(new StringRepresentation(" "));
getResponse().getEntity().setSize(19601021);
getResponse().getEntity().setRange(new Range(0, 2));
getResponse().getEntity().setModificationDate(new Date());
getResponse().getEntity().setExpirationDate(new Date());
getResponse().getEntity().setMediaType(MediaType.AUDIO_MPEG);

第一行是旧测试的遗物。如果我只使用保存两个字节的实际InputRepresentation,它就可以正常工作。

我从中学到了什么,首先整理你的代码,然后提出问题^^