我用 restlet 构建了一个 REST-API 来提供一个 mp3 文件。但是文件是同时创建和提供的。更多关于这里的信息。
它工作得很好,但我只在桌面环境中测试过。当我启动 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 不适合这个应用领域?
提前致谢