2016-07-26 6 views
1

に複数の応答を組み合わせ、私はそれより下のコンテンツc50c4a23307529b59797525c52b2c50c *は1つのレスポンス

は、今私はJSONとしてfile1Responseとfile2Response &リターンを組み合わせたいfile1.zipでファイルをダウンロードしています。どのようにそれを行うにはどのような助け?次のように

@GET 
@Path("/" + getfileschecksum) 
@Produces("application/json") 
public Response getFilesChecksum() { 
     String fileid1 = "file1"; 
     String fileid2 = "file2"; 


     Response file1Response = getChecksum(fileid1); 
     Response file2Response = getChecksum(fileid2); 

     return file1Response; 


    } 

はArrayListのを追加しようとした:Javaクラスjava.util.ArrayList内のメッセージボディのライター、およびJava:

@GET 
    @Path("/" + getfileschecksum) 
    @Produces("application/json") 
    public Response getFilesChecksum() { 
      String fileid1 = "file1"; 
      String fileid2 = "file2"; 

      ArrayList<Response> rp = new ArrayList<Response>(); 

      Response file1Response = getChecksum(fileid1); 
      Response file2Response = getChecksum(fileid2); 

      rp.add(file1Response); 
      rp.add(file2Response); 
      return Response.ok(rp).build(); 


     } 

はエラーcom.sun.jersey.api.MessageExceptionを返しますクラスjava.util.ArrayList型、MIMEメディアタイプapplication/jsonが見つかりませんでした。

file1レスポンスは下記から来ていますが、以下を変更して文字列を返すことができます。

  URL url = new URL(binpath); 
      URLConnection connection = url.openConnection(); 
      InputStream is = connection.getInputStream(); 
      String mt = connection.getContentType(); 
      ResponseBuilder response = Response.ok((Object) is, mt); 
      response.header("Content-Disposition","attachment; filename=" + binpath.substring(binpath.lastIndexOf('/') + 1, binpath.length())); 
      return response.build(); 
+0

私はResponseがjavax.ws.rs.core.Responseオブジェクトであると仮定しています。これはインターフェイスなので、シリアル化する方法をシリアライザに伝えるには、まず@JsonTypeInfoを追加する必要があります。 ArrayListをArrayList に変換し、Responseオブジェクトではなく実際の文字列値をそこに配置する必要があります。 –

+0

私はfile1Response.getEntity()。toString()を試しましたが、実際のコンテンツではなく[email protected]を返します。どのように応答から文字列を取得するには? – Newbie

答えて

0

試してみてください。

StringBuffer response = new StringBuffer(); 
response.append(file1Response); 
response.append(file2Response); 

return response.toString(); 

害それが動作しない場合は、唯一の手助けしようとしています。 しかし、もしそれが親指を上げれば。

+0

動作しませんでした。&file1Responseからコンテンツを返しません。 – Newbie

0

実際に文字列チェックサムを返す別のメソッドを作成し、リソースメソッドでそのメソッドを呼び出すことをお勧めします。

@GET 
@Path("{file}/checksum") 
Response getChecksum(@PathParam("file") final String file) { 
    return Response.ok(calculateChecksum(file)).build(); 
} 


@POST 
@Path("checksums") 
Response getChecksum(final List<String> toChecksum) { 
    final List<String> checksums = new ArrayList<>(); 
    for (String s : toChecksum) { 
     checksums.add(calculateCheckSum(s)); 
    } 
    return Response.ok(checksums).build(); 
} 



private String calculateCheckSum(final String file) { 
    // do your checksum 
} 
+0

URL url =新しいURL(binpath); URLConnection connection = url.openConnection(); InputStreamは= connection.getInputStream()です。 String mt = connection.getContentType();応答のResponse.ok((オブジェクト)は、mt); ResponseBuilderレスポンス= Response.ok (binpath.length())); response.header( "Content-Disposition"、 "attachment;ファイル名=" + binpath.substring(binpath.lastIndexOf( '/')+ 1、binpath.length())); return response.build();これは、文字列にフェッチする必要があるfile1Responseを返します。 – Newbie

+0

私は完全に質問を誤解しました。 jsonとしてバイナリファイルを返すことはできませんが、これは不可能です。あなたが1つのリクエストで2つのファイルバイナリファイルを返そうとしているなら、これは私が見る限り可能ではありません。可能であれば、ファイルは1つのファイルとして表示され、破損しているように見えます。複数のファイルをダウンロードする必要がある場合は、単一のアーカイブファイルを送信する前に、それらをサーバー側の単一のzip、tar、rarなどにアーカイブする必要があります。あなたのケースでは、それはジッパーのジッパーのように見えます。 –

+0

ファイルの内容はテキストのみです。 Javaのコンテンツを読むことは可能ですか?またはResponseBuilderを使用してファイルからStringへの応答を変更する方法があります。 – Newbie

関連する問題