0

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 はこのアプリケーション領域に適していませんか?

前もって感謝します

4

1 に答える 1