mp3 ファイルを提供するために、restlet を使用して REST-API を構築しています。ただし、ファイルは同時に作成され、提供されます。詳細については、こちらをご覧ください。
完全に動作しますが、デスクトップ環境でのみテストしました。API をテストするために iPad を起動すると、ファイルの再生が開始されますが、数秒後に停止し、新しいリクエストが送信され、ファイルの再生が最初から開始されます。
一部の研究者の後、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;
}
どうすればいいのかわかりません。2 バイトを返す独自の InputStream を書き込もうとしましたが、成功しませんでした。それとも、InputRepresentation はこのアプリケーション領域に適していませんか?
前もって感謝します