2017-01-11 2 views
0

私は、RestレスAPIにリクエストするServletを持っています.HttpServletResponseを介してAPIレスポンスのコンテンツを最終的なユーザーに返すようにしたいと考えています。JAX-RS応答をHttpServletResponseに再利用するにはどうすればよいですか?

コンテンツは実際にはStreamingOutputオブジェクトを使用してResponseに挿入する.xlsファイルです。

どうすればいいですか? EDIT

@Override 
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 

    Client client = ClientBuilder.newClient(); 
    WebTarget target = client.target(url); 
    Response res = target. request().get(); 
    if (res.getStatus() == 200) { 
     // how to put res stream into response stream ? 
     ServletOutputStream stream = response.getOutputStream(); 
    } 
    client.close(); 
} 

私はTedTrippin方法を試してみましたが、見つけるの後

@GET 
@Produces(MediaType.APPLICATION_JSON) 
@Path("bla") 
public Response getTopicByName() { 

    final Workbook wb = new HSSFWorkbook(); 
    StreamingOutput stream = new StreamingOutput() { 
     @Override 
     public void write(OutputStream output) throws IOException, WebApplicationException { 
      wb.write(output); 
     } 
    }; 
    responseBuilder = responseBuilder.entity(stream); 
    responseBuilder = responseBuilder.status(Response.Status.OK); 
    responseBuilder = responseBuilder.header("Content-Disposition", "attachment; filename=" + device + ".xls"); 

    return responseBuilder.build(); 
} 

サーブレットPOSTメソッド:私は、HttpServletResponseのに

休憩APIメソッドを応答をキャストすることはできませんResponseからInputStreamを回復する方法はうまくいきました。

しかし、私は破損したxlsファイルを取得し続けます。そしてそれはかなり迷惑です。私は、ブラウザから直接要求を行うと、その破損したファイルを取得しません。 どこから来たのか手がかりがありますか?

POSTメソッド:

@Override 
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 

    Client client = ClientBuilder.newClient(); 
    WebTarget target = client.target(url + param + format); 
    Response res = target.request().get(); 
    if (res.getStatus() == 200) { 
     response.setHeader("Content-Disposition", "attachment; filename=test.xls"); 
     InputStream in = res.readEntity(InputStream.class); 
     ServletOutputStream out = response.getOutputStream(); 
     byte[] buffer = new byte[1024]; 
     while (in.read(buffer) >= 0) { 
      out.write(buffer); 
     } 
     out.flush(); 
    } 
    client.close(); 
} 

答えて

1

最も簡単な方法は、応答ストリームを読み、応答出力ストリームに直接それを書くことです。 (あなたのビューに応じて)よりよい方法は、一時ファイルとしてレスポンスを読み込み/保存することです、あなたはそれを返すか、書くことができ

try (InputStream in = ...; 
    OutputStream out = ...) { 
    byte[] buffer = new byte[1024]; 
    while (in.read(buffer) >= 0) 
    out.write(buffer); 
} catch (IOException ex) { 
    ... 
} 

... IOUtilsやグァバまたは純粋なJavaからライブラリ関数を使用しますかそれを出力ストリームに渡します。

第3のアプローチはパイプを作成することですが、ここでは該当しないと思います。

+0

ありがとうございました。しかし、今私は別の問題があります:( – Phoste

関連する問題