11

私は Jersey を使用して RESTful API リソースを作成しResponseBuilder、応答を生成しています。

RESTful リソースのコード例:

public class infoResource{
  @GET
  @Path("service/{id}")
  @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
  public Response getCompany(@PathParam("id")String id) {
      //company is just a POJO.
      Company company = getCompany(id);
      return Response.status(200).entity(company).build();  
  }
}

応答では、応答ヘッダーでチャンク転送エンコーディングを返しています。「ジャージの世界」で、応答ヘッダーContent-Lengthのヘッダーの代わりにヘッダーを返す適切な方法は何ですか?Transfer-Encoding: chunked

4

4 に答える 4

5

Content-Lengthまたは選択するTransfer-Encodingのは、それらのコンテナーの選択です。それは実際にはバッファサイズの問題です。

SevletFilter考えられる解決策の 1 つは、マーシャリングされたすべてのバイトをバッファリングし、Content-Lengthヘッダー値を設定する を提供することです。

このページを参照してください。

@WebFilter
public class BufferFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) {
    }

    @Override
    public void doFilter(ServletRequest request,
                         ServletResponse response,
                         FilterChain chain)
        throws IOException, ServletException {

        final ByteArrayOutputStream buffer =
            new ByteArrayOutputStream();

        // prepare a new ServletResponseWrapper
        // which returns the buffer as its getOutputStream();

        chain.doFilter(...)

        // now you know how exactly big is your response.

        final byte[] responseBytes = buffer.toByteArray();
        response.setContentLength(responseBytes.length);
        response.getOutputStream().write(responseBytes);
        response.flush();
    }

    @Override
    public void destroy() {
    }
}
于 2012-08-02T13:01:01.067 に答える
1

たとえば、入力ストリームがローカル ファイル システムから読み取られる場合は、次のように追加します。

response.header( "Content-Length", file.length() );

より明確な説明については、完全なコードを確認してください。

@Path("/files")
public class FileDownloadService {

    private static final String TXT_FILE = "C:\\your file";    
    @GET
    @Path("/txt")
    @Produces(MediaType.APPLICATION_OCTET_STREAM)
    public Response getTextFile() throws IOException {
        File file = new File(TXT_FILE);
        FileInputStream inStream = new FileInputStream(file);
        ResponseBuilder response = Response.ok((Object) inStream);
        response.header("Content-Disposition", "attachment; filename=\"filename\"");
        response.header( "Content-Length", file.length() );
        return response.build();
    }  
}

クライアント側は Apache HttpClient コードです。

于 2015-02-18T14:02:17.890 に答える