我使用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不适合这个应用领域?
提前致谢
答案 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,它就可以正常工作。
我从中学到了什么,首先整理你的代码,然后提出问题^^