2016-08-25 68 views
0

我正在使用java URL類調用Web服務。我正在使用下面的代碼。無法檢索SOAP響應消息

public void makeHttpsCall(URL url, File file, String outputpath){ 
HostnameVerifier hv = new HostnameVerifier() { 
      public boolean verify(String hostname, SSLSession session) { 
       return true; 
      } 
     }; 
    try { 
     SSLContext sc = SSLContext.getInstance("SSL"); 
     sc.init(null, util.disableCertificateValidation(), 
       new SecureRandom()); 
     HttpsURLConnection 
       .setDefaultSSLSocketFactory(sc.getSocketFactory()); 
     HttpsURLConnection.setDefaultHostnameVerifier(hv); 
     URLConnection connection = url.openConnection(); 
     HttpsURLConnection httpsConn = (HttpsURLConnection) connection; 
     BufferedReader in = new BufferedReader(new InputStreamReader(
       new FileInputStream(file), Charset.forName("ISO-8859-1"))); 
     StringBuilder builder = new StringBuilder(); 
     String aux = ""; 
     while ((aux = in.readLine()) != null) { 
      builder.append(aux); 
     } 
     String requestContent = builder.toString(); 
     in.close(); 
     System.out.println(requestContent); 
     byte[] b = requestContent.getBytes(Charset.forName("UTF-8")); 

     httpsConn.setConnectTimeout(15000); 
     httpsConn.setRequestProperty("Content-Length", 
       String.valueOf(b.length)); 
     httpsConn.setRequestProperty("Content-Type", 
       "text/xml; charset=ISO-8859-1"); 
     httpsConn.setRequestMethod("POST"); 
     httpsConn.setDoOutput(true); 
     httpsConn.setDoInput(true); 
     httpsConn.setReadTimeout(15000); 
     OutputStream out = httpsConn.getOutputStream(); 
     out.write(b); 
     out.close(); 

     System.out.println("Before geinputstream"); 
     int statusCode = httpsConn.getResponseCode(); 

     System.out.println("Response code : " + statusCode); 
     // System.out.println("Error stream has value"); 

     if (statusCode != 200) { 
      BufferedReader br_err = null; 

      br_err = new BufferedReader(new InputStreamReader(
        httpsConn.getErrorStream())); 
      String err_response = ""; 
      String one_char; 
      while ((one_char = br_err.readLine()) != null) { 
       err_response += one_char; 
      } 
      System.out.println("Error response : " + err_response); 
      httpsConn.disconnect(); 
      JOptionPane.showMessageDialog(null, "Fault response received"); 
      util.writeFaultResponseTofile(httpsConn.getContentType(), 
        outputpath, err_response, file.getName(), logger); 
     } 

     else { 

      InputStreamReader isr = new InputStreamReader(
        httpsConn.getInputStream()); 
      BufferedReader br = new BufferedReader(isr); 
      String responseString = ""; 
      String reponseContent = ""; 
      // Write the SOAP message response to a String. 
      while ((responseString = br.readLine()) != null) { 
       reponseContent = reponseContent + responseString; 
      } 

      if (httpsConn.getResponseMessage().equalsIgnoreCase("ok")) { 
       logger_req.info("Response message OK "); 
       httpsConn.disconnect(); 
       logger_req.info("Response content:" + reponseContent); 

       util.writeResponseTofile(httpsConn.getContentType(), 
         outputpath, reponseContent, file.getName(), logger); 

      } else { 
       logger_req.info("Response message not OK "); 
       JOptionPane.showMessageDialog(null, 
         "Response message from SSB is not OK"); 
      } 
} 

我可以向web服務請求並接收響應。我將響應代碼設置爲200,表示響應已成功接收。但是當我嘗試寫入對文件的SOAP響應時,它是空的。你能請任何人幫忙。

回答

0

我看你在檢查狀態碼後關閉了連接。您可以請嘗試註釋該行 - 例如 -

if (httpsConn.getResponseMessage().equalsIgnoreCase("ok")) { 
      logger_req.info("Response message OK "); 
      // httpsConn.disconnect(); 
      logger_req.info("Response content:" + reponseContent); 

      util.writeResponseTofile(httpsConn.getContentType(), 
        outputpath, reponseContent, file.getName(), logger); 

     } else { 
      logger_req.info("Response message not OK "); 
      JOptionPane.showMessageDialog(null, 
        "Response message from SSB is not OK"); 
     } 
+0

我試過評論該行,但仍存在問題。我調試了代碼,控制不會進入下面的while循環,因爲responseString爲null。//將SOAP消息響應寫入字符串。 ((responseString = br.readLine())!= null){ reponseContent = reponseContent + responseString; }。 –

+0

3件事 - 然後檢查響應中是否真的有東西。使用其他工具,如瀏覽器中的某個插件或soap UI。第二件事 - 確保你正在沖洗/關閉輸出文件編寫器。 3rd - 檢查記錄器的日誌級別。如果它被配置爲打印警告和以上,那麼它不會'打印INFO消息。 –

+0

順便說一句,看起來你可以看到通過記錄器的響應,但無法將其打印在文件中。這是問題嗎? –