2

まず、英語でごめんなさい。第二に、私が話したいことについての既存の投稿がたくさんあることを知っていますが、私が検索した限り、私の「特定の」問題に(本当に)関連するものは何も見つかりませんでした。だからここに行きます。

私は現在、JAVARESTfulWebサービスを開発しています。このWebサービスの目的は、接続されたクライアントにいくつかのXMLファイル(より正確には、いくつかのOVAL定義)を送信することです。私は4つの「解決策」を見てきました:

  • すべてのXMLファイルの内容を文字列に入れ(必要に応じてこの文字列をbase64でエンコードします)、文字列をクライアントに送信します
  • すべてのXMLファイルの内容をByte[]に入れ、Byte[]をクライアントに送信します
  • FTP補助サーバーを使用する
  • ソケット(InputStream / OutputStream)でストリーミングしてファイルを送受信します

今のところ、私はソリューションn°4を選択することにしました。ファイル転送に関する私のコードの一部を以下に示します。


サーバ側:

@Path("/sendXML")
@Produces(MediaType.TEXT_PLAIN)
@GET
@Path("/sendXML")
@Produces(MediaType.TEXT_PLAIN)
public String getHtml(@Context HttpServletResponse  serv) throws IOException {
    ServletOutputStream o =serv.getOutputStream();
    try {
        FileInputStream fis = new FileInputStream(new File("xml file to send"));
        int c;

        while ((c = fis.read()) != -1) {
           o.write(c);
        }

        fis.close();
        o.close();
    } catch (Exception e) {
        System.err.println("e");
    } 

    return "OK" ;
}

クライアント側:

try {
        URL u = new URL("http://localhost:8080/ws.example.filetransfer/rest/sendXML");
        HttpURLConnection uc = (HttpURLConnection) u.openConnection();


        InputStream is = uc.getInputStream();

        try {
            FileOutputStream fos = new FileOutputStream(new File("path where the file will be saved"));
            int c;

            while ((c = is.read()) != -1) {
               fos.write(c);
            }


            is.close();
            fos.close();
        } catch (Exception e) {
            System.err.println("FileStreamsTest: " + e);
        } 

    } catch (Exception e) {
        e.printStackTrace();
    }

私はEclipseでプログラムを開発およびテストしています。すべて問題ないようです。XMLファイルはサーバーからクライアントに適切に送信され、ディスクに保存されます。クライアントプログラムを起動したときのコンソール出力は次のとおりです(サーバーはすでに起動しています)。

<?xml version="1.0"?><hello> Hello Jersey</hello>
<html> <title>Hello Jersey</title><body><h1>Hello Jersey</body></h1></html> 
<?xml version="1.0" encoding="UTF-8"?>
<oval_definitions xsi:schemaLocation="http://oval.mitre.org/XMLSchema/oval-  definitions-5 oval-definitions-schema.xsd http://oval.mitre.org/XMLSchema/oval-definitions-5#hpux hpux-definitions-schema.xsd http://oval.mitre.org/XMLSchema/oval-common-5 oval-common-schema.xsd http://oval.mitre.org/XMLSchema/oval-definitions-5#unix unix-definitions-schema.xsd" xmlns="http://oval.mitre.org/XMLSchema/oval-definitions-5" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:oval="http://oval.mitre.org/XMLSchema/oval-common-5" xmlns:oval-def="http://oval.mitre.org/XMLSchema/oval-definitions-5">
<generator>
<oval:product_name>The OVAL Repository</oval:product_name>
<oval:schema_version>5.10.1</oval:schema_version>
<oval:timestamp>2012-06-29T05:09:57.714-04:00</oval:timestamp>
</generator>
[...]

ご覧のとおり、クライアントがXMLファイルを受信すると、このコンテンツをディスク(コードで指定されたファイル)に書き込むだけでなく、stdoutにコンテンツを書き込みます。コンテンツもディスクに書き込まれるため、stdoutへの書き込みは小さな問題ですが、これは正常なのか、一種のEclipseバグなのか、それとも私からのバグなのか..?

結論として、ここに私の質問があります:

  • あなたによると、JAVA REST WebサービスでXMLファイルを転送するための最良の方法は何ですか?
  • ストリーミングソリューションは良い方法だと思いますか?
  • このソリューションを適切に実装しましたか(@Contex属性の使用など、いくつかのコードに疑問があります)?

ご清聴ありがとうございました!ハイゼン89

4

0 に答える 0