2012-06-12 189 views
0

我正在實現基於WS的代理,它將管理肥皂請求到/從PCRF響應。該連接通過https端口進行,並使用Java Key Store(一種密鑰存儲工具)生成a key-store file from a trusted certificate。連接似乎沒問題(我不確定身份驗證是否成功),但返回的信息(響應)是一個短的不可讀字符串。Java Web服務請求響應問題

通過SoapUI應用程序相同的程序工作得很好。

這兩個過程之間的唯一區別是,第一次使用密鑰存儲區,第二次使用可信證書。

我該如何解決這個問題?我不明白哪裏出了問題。

如果它能幫助我分享用於SOAP消息發送者的Java源和從PSRF收到的響應到SoapUI和實現的WS。

package SOAPSender; 

import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.OutputStreamWriter; 
import java.net.Socket; 

public class DebugMain { 

    public static void main(String[] args) { 
     //PCRFProvisioningAgent temp = new PCRFProvisioningAgent(); 

      loadKeyAndTrustStore(); 

      StringBuffer outputStream = new StringBuffer(); 
      BufferedWriter wr = null; 
      BufferedReader rd = null; 
      Socket sock = null; 
      String outputBuffer = null; 

      try { 

       // Create socket 
       sock = new Socket("10.96.227.219", 8080); 

       // Create header 
       wr = new BufferedWriter(new OutputStreamWriter(
         sock.getOutputStream(), "UTF-8")); 

       String xmlData = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:rm=\"rm:soap\">"+ 
          "<soapenv:Header/>"+ 
          "<soapenv:Body>"+ 
           "<rm:getSubscriber>"+ 
           "<inPara>"+ 
            "<subscriber>"+ 
             "<attribute>"+ 
              "<key>USRIDENTIFIER</key>"+ 
              "<value>284090000000004</value>"+ 
             "</attribute>"+ 
            "</subscriber>"+ 
           "</inPara>"+ 
           "</rm:getSubscriber>"+ 
          "</soapenv:Body>"+ 
         "</soapenv:Envelope>";    

       wr.write("POST https://10.96.227.219:8080/axis/services/ScfPccSoapServiceEndpointPort HTTP/1.1\r\n"); 
       wr.write("User-Agent: https://10.96.227.219:8080/axis/services/ScfPccSoapServiceEndpointPort\r\n"); 
       wr.write("Content-Length: " + xmlData.length() + "\r\n"); 
       wr.write("Content-Type: text/xml;charset=UTF-8\r\n"); 
//    wr.write("SOAPAction: \"rm:soap/ScfPccSoapServiceEndpoint/getSubscriberRequest\"\r\n"); 
       wr.write("SOAPAction: \"\"\r\n"); 
       wr.write("\r\n"); 

       // Send data 
       wr.write(xmlData); 
       wr.flush(); 

       // Read response 
       // exception handler - when connection is reset instead of close 
       // after sending a packet from source 
       char cbuf[] = new char[4096]; 
       int i = 0; 
       // buffer is sized to max 4096 packet size 

       try { 
        rd = new BufferedReader(new InputStreamReader(
          sock.getInputStream(), "UTF-8")); 
        while ((i = rd.read(cbuf)) != -1) { 
         outputStream.append(cbuf, 0, i); 
         int contStartIndex = outputStream.toString().indexOf(
           "Content-Length: ") 
           + "Content-Length: ".length(); 
         int contEndIndex = outputStream.toString().indexOf("\n", 
           contStartIndex) - 1; 
         if (outputStream.toString().indexOf("Content-Length: ") != -1) { 
          int contLength = Integer.valueOf(
            outputStream.toString().substring(
              contStartIndex, contEndIndex)) 
            .intValue(); 
          int headerLength = outputStream 
            .toString() 
            .substring(
              0, 
              outputStream.toString().indexOf(
                "\n\r\n")).length() + 3; 
          // if the message body is complete but there is not an 
          // ending character 
          // while will break 
          // warning - with national characters! content length is 
          // count of bytes not chars 
          if (i - headerLength >= contLength) 
           break; 
         } 
        } 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
       System.out.println("--------\n" + String.valueOf(cbuf) 
         + "\n--------------"); 
       outputBuffer = outputStream.toString(); 

      } catch (Exception e) { 
       e.printStackTrace(); 
      } finally { 
       try { 
        if (wr != null) 
         wr.close(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
       try { 
        if (rd != null) 
         rd.close(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
       try { 
        if (sock != null) 
         sock.close(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
    } 

    private static void loadKeyAndTrustStore() { 
     try { 
      // System.out.println(Constants.ROOT_PATH + Constants.STORE_FILE); 
      // AdminLogger.error("Certificate file: " + Constants.ROOT_PATH 
      // + Constants.STORE_FILE); 

      // System load ssl the file of certificate 
      // Load Key store 

      System.out.println(System.getProperty("javax.net.ssl.keyStoreType")); 
      System.setProperty("javax.net.ssl.keyStoreType", "****"); 
      System.out.println(System.getProperty("javax.net.ssl.keyStoreType")); 

      System.out.println(System.getProperty("javax.net.ssl.keyStore")); 
      System.setProperty("javax.net.ssl.keyStore", 
        "****"); 
      System.out.println(System.getProperty("javax.net.ssl.keyStore")); 

      System.out.println(System.getProperty("javax.net.ssl.keyStorePassword")); 
      System.setProperty("javax.net.ssl.keyStorePassword", "****"); 
      System.out.println(System.getProperty("javax.net.ssl.keyStorePassword")); 


      // TrustStore 

      System.out.println(System.getProperty("javax.net.ssl.trustStore")); 
      System.setProperty("javax.net.ssl.trustStore", 
        "****"); 
      System.out.println(System.getProperty("javax.net.ssl.trustStore")); 

      System.out.println(System.getProperty("javax.net.ssl.trustStorePassword")); 
      System.setProperty("javax.net.ssl.trustStorePassword", "****"); 
      System.out.println(System.getProperty("javax.net.ssl.trustStorePassword")); 

     } catch (Exception ex) { 
      // AdminLogger.error(ex, "StartupServlet.loadKeyAndTrustStore"); 
     } 
    } 

} 

這是響應:

...這裏是從了SoapUI應用程序的響應:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <soapenv:Body> 
     <getSubscriberResponse xmlns="rm:soap"> 
     <result xmlns=""> 
      <resultCode>12302</resultCode> 
      <paras> 
       <key>errorDescription</key> 
       <value>The subscriber does not exist.</value> 
      </paras> 
     </result> 
     </getSubscriberResponse> 
    </soapenv:Body> 
</soapenv:Envelope> 

回答

1

套接字不調用Web服務的理想途徑來自Java。請使用JAX-WS之類的Java API。從PSRF Web服務獲取WSDL並使用ws-import命令生成客戶端存根。

在安全性方面,您將需要使用JAX-WS安全API來調用受WS-Security保護的Web服務。

看到這個話題 - jax-ws-consuming-web-service-with-ws-security-and-ws-addressing

感謝, Sreehari。

+0

我沒有提到將這些SOAP消息發送給PCRF的系統是使用java 1.4.2配置的! – nenito

0

正如@sreehari指出的那樣,Sockets對於調用Web服務並不理想 - 您將基本上必須自己實現應用協議(例如HTTP/S)的所有相關細節。這本身就是一項巨大的事業。

如果你想保持「低級」,並自己構建請求,那麼我建議你「升級」到使用HttpsUrlConnection。