0

Я пытаюсь сделать один вызов веб-службы второй веб-службой. Первый - это тонкий слой доступа. Моя нижняя вебсервис выглядит так,HttpURLConnection Post Request отвечает на ответ от javax.rs.ws.Response Object

@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() в качестве своей сущности. Это работает, если я отправляю запрос POST прямо, но я хочу пройти через отдельный веб-сервис. Вот что я пытаюсь сделать, чтобы читать в ответ, а затем срыгивать.

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(); 

} 

Но это не сработает. Я не могу понять, как использовать ответ, преобразовать его обратно в объект ответа и отправить его.

ответ

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(); 

} 
Смежные вопросы