2016-06-13 6 views
0

データを送信し、サーバー上で計算して結果を返すために、JavaでいくつかのREST Webサービスを作成しようとしています。最初の段階では、Excelファイルとして情報を送受信します(将来はXMLまたはJSONを使用することをお勧めします)。 さて、それを試してみたり、たくさんの投稿を読んだら、私はそれを達成するのに非常に近いと思われますが、サーバーの最終応答を得る方法はわかりません。 は、私はこのようなサービスがあります。REST Webサービスからカスタマイズされたレスポンスとファイルを受け取る

@GET 
@Path("/test") 
@Produces(MediaType.APPLICATION_OCTET_STREAM) 
public Response getFile(@QueryParam("IDfile") String IDfile) { 
    if(IDfile.trim().length() == 0 || IDfile == null) { 
     return Response.status(Response.Status.BAD_REQUEST).entity("IDfile cannot be blank").build(); 
    }   

    String uploadedFileLocation = "C:\\FilesWebservice\\" + IDfile; 
    Boolean sortida = false; 
    try { 
     prova prueba = new prova(); 
     sortida = prueba.prova(uploadedFileLocation); //this creates an xls file as response 
    } catch (Exception ex) { 
     System.out.println("error" + ex.toString()); 
     Logger.getLogger(ServiceResource.class.getName()).log(Level.SEVERE, null, ex); 
    } 

    if (sortida) { 
     File file = new File("C:\\FilesWebservice\\out\\prediction.xls"); // the File path you want to serve. 
     return Response.ok(file, MediaType.APPLICATION_OCTET_STREAM) 
      .header("Content-Disposition", "attachment; filename=\"" + file.getName() + "\"") //optional 
      .build(); 
    } else 
     return Response.status(500).entity("It was unable to calculate (Ask God for the reason)").build(); 

} 

私は私が私のダウンロードフォルダ内のファイルを受け取るブラウザからGETを送信するが、私は他のアプリケーションとサービスを消費する必要がある場合には、[OK]を動作します。したがって、私はNetbeansでクライアントを開発しています。その後、NBはWebサービスに従って自動コードを作成しました。この場合、私は持っています:

多分、私はいくつかの行を追加しました、私は今思い出すことができません。とにかく、サービスはステータスコード、カスタマイズされたメッセージ、および添付ファイルとしてファイルを返します。私は、少なくともステータスコードを読んで、明らかにファイルを保存したいが、私はそれをどうやって行うことができるのか分からない。

MyJerseyClientAlgA client = new MyJerseyClientAlgA("192.168.1.30"); 
    Object response = client.getFile(Response.class, "3cphkhfu.xls"); 

が、私が「応答」から必要な情報を抽出するために失敗した: は、私が実行しようとしました。 ヘルプやアイデアをいただければ幸いです。事前に

感謝

EDIT:あなたの返事を@LutzHorn

感謝。私はあなたの提案をよく理解しているかどうか分からず、いくつかのテストを行い、解決策が見つかったら私の質問のもとに投稿します。とにかく、私は再びRESTサービスを利用するための自動コードを生成し、それは次のようになります。

public <T> T getFile(Class<T> responseType, String IDfile) throws ClientErrorException { 
    WebTarget resource = webTarget; 
    if (IDfile != null) { 
     resource = resource.queryParam("IDfile", IDfile); 
    } 
    resource = resource.path("test"); 
    return resource.get(responseType); 
} 

が、私は最後の行でエラーが発生していることを示し:メソッドget(: シンボルに

シンボルを見つけることができませんクラス)

ので、私は

リターンresource.request(MediaType.APPLICATION_OCTET_STREAM_TYPE)に.get(responseType)のために、この行を変更。

しかし、これが正しいかどうかはわかりません。

+0

'resource.request'を返すのではなく、ローカル変数に割り当てます。 NetBeansはこの変数の正しいタイプの設定に役立ちます。次に、ステータスコードと応答本文にアクセスできます。 –

答えて

0

検索とテストの時間がかかった後、このコードが機能します。私はそれが最良の解決策であるかどうかわかりませんが、私が望むものを正確に実行します:ステータスを抽出し、Webサービスから返されたファイルを保存します。

public void getFile(String IDfile) throws ClientErrorException { 
    WebTarget resource = webTarget; 
    if (IDfile != null) { 
     resource = resource.queryParam("IDfile", IDfile); 
    } 
    resource = resource.path("test"); 
    Invocation inv = resource.request(MediaType.APPLICATION_OCTET_STREAM_TYPE).buildGet(); 
    Response rp = inv.invoke(); 
    InputStream attachment = null; 
    try { 
     if (rp.getStatus() == 200) { 
      attachment = rp.readEntity(InputStream.class); //This method can be invoked only once unless you buffer the response... 
      ReadableByteChannel rbc = Channels.newChannel(attachment); //website.openStream() 
      FileOutputStream fos = new FileOutputStream("C://FilesWebservice/solution.xls"); 
      fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);     
     } else { 
      System.out.println(rp.getStatus()); 
     } 
    } catch (Exception ex) { 
      ex.printStackTrace(); 
    } finally { 
     rp.close(); 
    } 

} 
関連する問題