0

1 つの Web サービスが 2 番目の Web サービスを呼び出そうとしています。最初の Web サービスはやや薄いアクセス レイヤーです。私の一番下のWebサービスは次のようになります。

@POST
@Path("/savechart")
@Produces("image/png")
public Response saveChart(@FormParam("chartId") String chartId, @FormParam("chartType") String chartType,
                          @FormParam("chartSubType") String chartSubType, @FormParam("authJsonMap") String authJsonMap,
                          @FormParam("chartParameters") String parameters, @FormParam("chartLocation") String chartLocation) {

    try {
        // String dataDetails = " Saved Chart ";
        if (chartId != null && !"".equalsIgnoreCase(chartId)) {

        }

        // SubProcessService subProcess = DaoRegistry.getSubProcessService();
        PhantomHelper p = new PhantomHelper("phantomjs");

        BufferedImage chart = p.saveChart(chartLocation , chartId, chartType, chartSubType, authJsonMap, parameters);
        ByteArrayOutputStream bao = new ByteArrayOutputStream();

        ImageIO.write(chart, "png", bao);

        byte[] imageData = bao.toByteArray();

        if (imageData == null) {
            return Response.status(210).build();
        }

        p.kill();
        // the request is received
        return Response.ok(new ByteArrayInputStream(imageData))
                .build();
    }
    catch (Exception exe)
    {
        System.out.println("Save Chart Exception: " + exe.toString());
        System.out.println("Save Chart Exception: " + exe.getStackTrace().toString());
        exe.printStackTrace(System.out);
        return Response.status(500).entity("Error Saving Chart : " + exe.getStackTrace() ).build();
    }

}

これは、png ファイルを作成し、エンティティとして ByteArrayInputStream() を持つ応答オブジェクトで画像を返す Web サービスです。これは、POST リクエストを直接送信した場合に機能しますが、別の Web サービスを経由したいと考えています。これが私が応答を読んで逆流するためにやろうとしていることです。

    public Response POST() throws Exception {

    // Create Post Request
    URL requestUrl = new URL(url);
    connection = (HttpURLConnection) requestUrl.openConnection();
    connection.setRequestMethod("POST");
    connection.setRequestProperty("User-Agent" , USER_AGENT);
    connection.setRequestProperty("Accept-Language" , ACCEPT_LANGUAGE);

    // User assigned properties to header
    if (requestProperties != null) {
        for (String key : requestProperties.keySet()) {
            connection.setRequestProperty(key , requestProperties.get(key));
        }
    }

    // Construct URL
    String urlParameters = constructUrl(parameters);

    connection.setDoOutput(true);

    DataOutputStream out = new DataOutputStream(connection.getOutputStream());

    out.writeBytes(urlParameters);
    out.flush();
    out.close();

    // BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));

    return Response.status(200).entity(connection.getInputStream()).build();

}

しかし、これはうまくいきません。応答を消費し、それを応答オブジェクトに変換して送信する方法がわかりません。

4

1 に答える 1

1

応答をバイト配列として読み取り、同様の ByteArrayOutputStream で応答することで、このプロセスを修正しました。コードは以下です

public Response POST() throws Exception {

    // Create Post Request


    URL requestUrl = new URL(url);
    connection = (HttpURLConnection) requestUrl.openConnection();
    connection.setRequestMethod("POST");
    connection.setRequestProperty("User-Agent" , USER_AGENT);
    connection.setRequestProperty("Accept-Language" , ACCEPT_LANGUAGE);

    // User assigned properties to header
    if (requestProperties != null) {
        for (String key : requestProperties.keySet()) {
            connection.setRequestProperty(key , requestProperties.get(key));
        }
    }

    // Construct URL
    String urlParameters = constructUrl(parameters);


    connection.setDoOutput(true);

    OutputStream outStream = connection.getOutputStream();

    DataOutputStream out = new DataOutputStream(outStream);

    out.writeBytes(urlParameters);
    out.flush();
    out.close();


    byte[] input = IOUtils.toByteArray(connection.getInputStream());

    return Response.status(200).entity(new ByteArrayInputStream(input)).build();

}
于 2015-06-03T22:23:48.703 に答える