0

我用 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 不适合这个应用领域?

提前致谢

4

1 回答 1

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 并且它工作得很好。

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

于 2013-10-30T09:04:21.490 回答