2013-07-03 13 views
11

Tôi đang chuyển đổi ứng dụng Foxpro trực quan thành ứng dụng web java và một phần nhỏ nhưng quan trọng của ứng dụng tạo yêu cầu xà phòng cho dịch vụ web.Tại sao tôi nhận được một lỗi java.net.SocketException: Lỗi kết nối lại từ dịch vụ web thông qua giao diện người dùng SOAP và máy khách Java?

Tôi đã viết 3 khách hàng thử nghiệm để gọi dịch vụ web này và tôi cũng đã thử nghiệm qua giao diện người dùng SOAP. Mỗi một trong các thử nghiệm của tôi đối với dịch vụ web này trả về lỗi: java.net.SocketException: Thiết lập lại kết nối. Vì vậy, tôi rõ ràng là thiếu cùng một điều trong mọi phương pháp kiểm tra, hoặc làm điều tương tự sai.

Tôi có mã Foxpro và tôi đã gửi thành công yêu cầu qua foxpro và nhận được phản hồi hợp lệ. Nhưng tôi không có bất kỳ kinh nghiệm với Foxpro, vì vậy tôi đã đấu tranh với sự khác biệt giữa các mã trong foxpro hoạt động và mã mới tôi đang viết bằng java.

Tôi hy vọng rằng ai đó có nhiều kinh nghiệm hơn với Soap và dịch vụ web có thể xem mã của tôi, có thể tự mình thử và giúp tôi hiểu vấn đề là gì.

Tôi sẽ cung cấp url dịch vụ web cũng như tất cả mã của tôi. Tôi cũng sẽ cung cấp mã dòng lệnh foxpro hoạt động.

Mã foxpro sử dụng CreateObject("Microsoft.XMLHTTP"). Tôi đã học được thông qua nghiên cứu của tôi rằng điều này cũng được sử dụng trong ASP, VB.net và C#.

1) Đây là dịch vụ web mà tôi cần phải gọi:

Host: https://rlisapi.myfwc.com/

Xà phòng Endpoint: https://rlisapi.myfwc.com/wsReceipts.asmx

WSDL: https://rlisapi.myfwc.com/wsReceipts.asmx?WSDL

dịch vụ web này không chứa ws-security. Thông tin đăng nhập nằm trong chính yêu cầu đó. Tôi không thể cung cấp những, tất nhiên, nhưng tôi không tin rằng họ là cần thiết để giúp tôi giải quyết vấn đề thiết lập lại kết nối.

2) Khách hàng đầu tiên tôi đã tạo API SAAJ đã sử dụng. Đây là mã của tôi:

import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.OutputStreamWriter; 
import java.net.InetAddress; 
import java.net.Socket; 
import java.util.ArrayList; 
import java.util.List; 

import javax.xml.soap.MessageFactory; 
import javax.xml.soap.Name; 
import javax.xml.soap.SOAPBody; 
import javax.xml.soap.SOAPBodyElement; 
import javax.xml.soap.SOAPConnection; 
import javax.xml.soap.SOAPConnectionFactory; 
import javax.xml.soap.SOAPElement; 
import javax.xml.soap.SOAPEnvelope; 
import javax.xml.soap.SOAPException; 
import javax.xml.soap.SOAPMessage; 
import javax.xml.soap.SOAPPart; 
import javax.xml.transform.Source; 
import javax.xml.transform.Transformer; 
import javax.xml.transform.TransformerException; 
import javax.xml.transform.TransformerFactory; 
import javax.xml.transform.stream.StreamResult; 

import org.apache.log4j.Logger; 

import com.mycompany.webapp.domain.transaction.BusinessEntityTransaction; 
import com.mycompany.webapp.domain.transaction.ccars.PaymentCart; 
import com.mycompany.webapp.domain.transaction.rlis.RlisTransaction; 

public class RlisService { 
    private static Logger logger = Logger.getLogger("com.companyxyz.webapp.service.transaction.RlisService"); 

    public List<BusinessEntityTransaction> getCurrentTransactions(PaymentCart paymentCart) { 
     List<BusinessEntityTransaction> transactionList = new ArrayList<BusinessEntityTransaction>(); 
     List<RlisTransaction> rlisList = new ArrayList<RlisTransaction>(); 
     try { 
      logger.info("Adding current transactions from RLIS system..."); 
      rlisList = this.getCurrentTransactionsViaSoapRequest(); 

      for (RlisTransaction tx : rlisList){ 
       //add transaction received from web service to transactionList 
      } 

     } catch (UnsupportedOperationException e) { 
      e.printStackTrace(); 
     } catch (SOAPException e) { 
      e.printStackTrace(); 
     } 
     // do something with the rlisList - the list of RlisTransactions 
     return transactionList; 
    } 

    private List<RlisTransaction> getCurrentTransactionsViaSoapRequest() 
      throws UnsupportedOperationException, SOAPException { 
     List<RlisTransaction> rlisTransactions = new ArrayList<RlisTransaction>(); 
     // Create SOAP Connection 
     try { 
      SOAPConnectionFactory soapConnectionFactory = SOAPConnectionFactory.newInstance(); 
      SOAPConnection soapConnection = soapConnectionFactory.createConnection(); 

      // Send SOAP Message to SOAP Server 
      String url = "https://rlisapi.myfwc.com/wsReceipts.asmx"; 
      SOAPMessage soapResponse = soapConnection.call(createSOAPRequest(), url); 

      // Process the SOAP Response 

      printSOAPResponse(soapResponse); 

      soapConnection.close(); 
     } catch (TransformerException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     return rlisTransactions; 
    } 


    private static SOAPMessage createSOAPRequest() throws SOAPException, IOException { 
     MessageFactory messageFactory = MessageFactory.newInstance(); 
     SOAPMessage soapMessage = messageFactory.createMessage(); 
     SOAPPart soapPart = soapMessage.getSOAPPart(); 

     //String serverURI = "http://rlisapi.outdoorlicensesolution.com/"; 

     // SOAP Envelope 
     SOAPEnvelope envelope = soapPart.getEnvelope(); 
     //envelope.addNamespaceDeclaration("http://api.outdoorlicensesolution.com/RLIS/", serverURI); 

     // SOAP Body 
     SOAPBody soapBody = envelope.getBody(); 
     Name bodyName = envelope.createName("getDailyReceipts", "rlis", "http://api.outdoorlicensesolution.com/RLIS/"); 
     SOAPBodyElement getDailyReceiptsElement = soapBody.addBodyElement(bodyName); 

    //Name contentLenghName = envelope.createName("Content-Length"); 
     Name consumerPinName = envelope.createName("ConsumerPIN"); 
     Name agentIdName = envelope.createName("AgentID"); 
     Name receiptDateName = envelope.createName("ReceiptDate"); 

     //SOAPElement contentLengthElement = getDailyReceiptsElement.addChildElement(contentLenghName);   
     //contentLengthElement.addTextNode("494"); 

     SOAPElement consumerPinElement = getDailyReceiptsElement.addChildElement(consumerPinName); 
     consumerPinElement.addTextNode("my-consumer-pin"); 

     SOAPElement agentIdElement = getDailyReceiptsElement.addChildElement(agentIdName); 
     agentIdElement.addTextNode("000"); //not a real agent id 

     SOAPElement receiptDateElement = getDailyReceiptsElement.addChildElement(receiptDateName); 
     receiptDateElement.addTextNode("2013-07-01T00:00:00"); 



/* 
//this is the soap request string from foxpro: 
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://www.w3.org/2003/05/soap-envelope"> 
<soap:Body> 
<getDailyReceipts xmlns="http://api.outdoorlicensesolution.com/RLIS/"> 
<Content-Length>494</Content-Length> 
<ConsumerPIN>APIKEY</ConsumerPIN> 
<AgentID>AGENTID</AgentID> 
<ReceiptDate>SALEDATE</ReceiptDate> 
</getDailyReceipts> 
</soap:Body> 
</soap:Envelope> 

*/ 
     soapMessage.saveChanges(); 

     /* Print the request message */ 
     System.out.print("Request SOAP Message = "); 
     soapMessage.writeTo(System.out); 
     System.out.println(); 

     return soapMessage; 
    } 

    private static void printSOAPResponse(SOAPMessage soapResponse) throws TransformerException, SOAPException { 
     logger.debug(soapResponse.getSOAPBody()); 
     TransformerFactory transformerFactory = TransformerFactory.newInstance(); 
     Transformer transformer = transformerFactory.newTransformer(); 
     Source sourceContent = soapResponse.getSOAPPart().getContent(); 
     logger.debug("\nResponse SOAP Message = "); 
     System.out.print("\nResponse SOAP Message = "); 
     StreamResult result = new StreamResult(System.out); 
     transformer.transform(sourceContent, result); 

    } 

} 

(3) Phiên bản tiếp theo của khách hàng của tôi sử dụng Socket và OutputStreamWriter

import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.OutputStreamWriter; 
import java.net.InetAddress; 
import java.net.Socket; 
import java.util.ArrayList; 
import java.util.List; 

import javax.xml.soap.MessageFactory; 
import javax.xml.soap.Name; 
import javax.xml.soap.SOAPBody; 
import javax.xml.soap.SOAPBodyElement; 
import javax.xml.soap.SOAPConnection; 
import javax.xml.soap.SOAPConnectionFactory; 
import javax.xml.soap.SOAPElement; 
import javax.xml.soap.SOAPEnvelope; 
import javax.xml.soap.SOAPException; 
import javax.xml.soap.SOAPMessage; 
import javax.xml.soap.SOAPPart; 
import javax.xml.transform.Source; 
import javax.xml.transform.Transformer; 
import javax.xml.transform.TransformerException; 
import javax.xml.transform.TransformerFactory; 
import javax.xml.transform.stream.StreamResult; 

import org.apache.log4j.Logger; 

import com.mycompany.webapp.domain.transaction.BusinessEntityTransaction; 
import com.mycompany.webapp.domain.transaction.ccars.PaymentCart; 
import com.mycompany.webapp.domain.transaction.rlis.RlisTransaction; 

public class RlisService { 
    private static Logger logger = Logger.getLogger("com.companyxyz.webapp.service.transaction.RlisService"); 

    public List<BusinessEntityTransaction> getCurrentTransactions(PaymentCart paymentCart) { 
     List<BusinessEntityTransaction> transactionList = new ArrayList<BusinessEntityTransaction>(); 
     List<RlisTransaction> rlisList = new ArrayList<RlisTransaction>(); 
     try { 
      logger.info("Adding current transactions from RLIS system..."); 
      rlisList = this.getCurrentTransactionsViaXmlHttp();   
      for (RlisTransaction tx : rlisList){ 
       //add transaction received from web service to transactionList 
      } 

     } catch (UnsupportedOperationException e) { 
      e.printStackTrace(); 
     } 
     // do something with the rlisList 
     return transactionList; 
    } 

    private List<RlisTransaction> getCurrentTransactionsViaXmlHttp(){ 
     List<RlisTransaction> rlisTransactions = new ArrayList<RlisTransaction>(); 

     String xmldata = "<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"" + 
     "xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"" + 
     "xmlns:soap=\"http://www.w3.org/2003/05/soap-envelope\">" + 
     "<soap:Body>" + 
     "<getDailyReceipts xmlns=\"http://api.outdoorlicensesolution.com/RLIS/\">" + 
     //"<Content-Length>494</Content-Length>" + 
     "<ConsumerPIN>APIKEY</ConsumerPIN>" + 
     "<AgentID>AGENTID</AgentID>" + 
     "<ReceiptDate>SALEDATE</ReceiptDate>" + 
     "</getDailyReceipts>" + 
     "</soap:Body>" + 
     "</soap:Envelope>"; 

     try{ 

      //Create socket 
      String hostname = "rlisapi.myfwc.com"; 
      int port = 443; 
      InetAddress addr = InetAddress.getByName(hostname); 
      Socket sock = new Socket(addr, port); 
      //Socket sock = new Socket(hostname, port); 

      //Send header 
      String path = "https://rlisapi.myfwc.com/wsReceipts.asmx"; 
      BufferedWriter wr = new BufferedWriter(new OutputStreamWriter(sock.getOutputStream(),"UTF-8")); 
      // You can use "UTF8" for compatibility with the Microsoft virtual machine. 
      wr.write("POST " + path + " HTTP/1.0\r\n"); 
      wr.write("Host: rlisapi.myfwc.com\r\n"); 
      wr.write("Content-Length: " + xmldata.length() + "\r\n"); 
      wr.write("Content-Type: text/xml; charset=\"utf-8\"\r\n"); 
      wr.write("\r\n"); 

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

      // Response 
      BufferedReader rd = new BufferedReader(new InputStreamReader(sock.getInputStream())); 
      String line; 
      while((line = rd.readLine()) != null) 
      System.out.println(line); 

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

     return rlisTransactions; 
    } 

} 

(4) Tôi có một khách hàng thử nghiệm tương tự có sử dụng HttpUrlConnection

import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.OutputStreamWriter; 
import java.net.HttpURLConnection; 
import java.net.MalformedURLException; 
import java.net.URL; 
import java.net.URLConnection; 

public class TestXmlClient { 

    public static void main(String[] args) { 
     String argUrl = "https://rlisapi.myfwc.com/wsReceipts.asmx"; 

     System.out.println("Test XML Client"); 

     String requestXml = 
       "<?xml version=\"1.0\" encoding=\"utf-8\"?>" + 
       "<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"" + 
       "xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" " + 
       "xmlns:soap=\"http://www.w3.org/2003/05/soap-envelope\">" + 
       "<soap:Body>" + 
       "<getDailyReceipts xmlns=\"http://api.outdoorlicensesolution.com/RLIS/\">" + 
       "<Content-Length>494</Content-Length>" + 
       "<ConsumerPIN>my-consumer-pin</ConsumerPIN>" + 
       "<AgentID>000</AgentID>" + //not real agent id 
       "<ReceiptDate>2013-07-01T00:00:00</ReceiptDate>" + 
       "</getDailyReceipts>" + 
       "</soap:Body>" + 
       "</soap:Envelope>" ; 

     System.out.println("Request: " + requestXml); 

     //try { 
     URL url; 
     OutputStreamWriter writer = null; 
     InputStreamReader reader = null; 
     HttpURLConnection con = null; 

     try { 
      url = new URL (argUrl); 
     con = (HttpURLConnection) url.openConnection(); 

     URLConnection urlc = url.openConnection(); 
     HttpURLConnection httpc = (HttpURLConnection)urlc; 
     // only interested in the length of the resource 
     httpc.setRequestMethod("HEAD"); 
     int len = httpc.getContentLength(); 

     System.out.println("length: " + len); 

     // specify that we will send output and accept input 
     con.setDoInput(true); 
     con.setDoOutput(true); 

     con.setConnectTimeout(20000); // long timeout, but not infinite 
     con.setReadTimeout(20000); 

     con.setUseCaches (false); 
     con.setDefaultUseCaches (false); 

     // tell the web server what we are sending 
     //con.setRequestProperty ("Content-Type", "text/xml"); 
     con.setRequestProperty ("Content-Type", "text/xml; charset=utf-8"); 
     //con.setRequestProperty("Connection", "close"); 

     writer = new OutputStreamWriter(con.getOutputStream()); 

     writer.write(requestXml); 
     writer.flush(); 
     writer.close(); 

     // reading the response 
     reader = new InputStreamReader(con.getInputStream()); 
     StringBuilder buf = new StringBuilder(); 
     char[] cbuf = new char[ 2048 ]; 
     int num; 
     while (-1 != (num=reader.read(cbuf))) { 
      buf.append(cbuf, 0, num); 
     } 
     String result = buf.toString(); 
     System.err.println("\nResponse from server after POST:\n" + result); 

     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      System.out.println(e.getStackTrace()); 
      e.printStackTrace(); 
     } catch (Exception e){ 
      e.printStackTrace(); 
     } finally{ 
      if (writer != null) { 
       try { 
        writer.close(); 
       } catch (Exception e) { 
        // ignore... 
       } 
      } 
      if (reader != null) { 
       try { 
        reader.close(); 
       } catch (Exception e) { 
        // ignore... 
       } 
      } 

      if (con != null) { 
       try { 
        con.disconnect(); 
       } catch (Exception e) { 
        // ignore... 
       } 

      } 
     } 
    } 
} 

Cuối cùng, ngoài tất cả các máy khách thử nghiệm này, tôi cũng đã thử gửi các yêu cầu khác nhau bằng cách sử dụng SOAP UI. Thật thú vị, tôi không thể tải wsdl từ url vì vậy tôi đã lưu mã nguồn wsdl vào một tập tin địa phương và sử dụng nó.

Đây là yêu cầu được tạo ra bởi Xà phòng UI từ file wsdl:

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:rlis="http://api.outdoorlicensesolution.com/RLIS/"> 
    <soap:Header/> 
    <soap:Body> 
     <rlis:getDailyReceipts> 
     <!--Optional:--> 
     <rlis:ConsumerPIN>?</rlis:ConsumerPIN> 
     <rlis:AgentID>?</rlis:AgentID> 
     <rlis:ReceiptDate>?</rlis:ReceiptDate> 
     </rlis:getDailyReceipts> 
    </soap:Body> 
</soap:Envelope> 

WSDL lưu tại địa phương:

<?xml version="1.0" encoding="utf-8"?> 
<wsdl:definitions xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:tns="http://api.outdoorlicensesolution.com/RLIS/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" targetNamespace="http://api.outdoorlicensesolution.com/RLIS/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"> 
    <wsdl:types> 
    <s:schema elementFormDefault="qualified" targetNamespace="http://api.outdoorlicensesolution.com/RLIS/"> 
     <s:element name="getDailyReceipts"> 
     <s:complexType> 
      <s:sequence> 
      <s:element minOccurs="0" maxOccurs="1" name="ConsumerPIN" type="s:string" /> 
      <s:element minOccurs="1" maxOccurs="1" name="AgentID" type="s:int" /> 
      <s:element minOccurs="1" maxOccurs="1" name="ReceiptDate" type="s:dateTime" /> 
      </s:sequence> 
     </s:complexType> 
     </s:element> 
     <s:element name="getDailyReceiptsResponse"> 
     <s:complexType> 
      <s:sequence> 
      <s:element minOccurs="0" maxOccurs="1" name="getDailyReceiptsResult" type="tns:ArrayOfReceipt" /> 
      </s:sequence> 
     </s:complexType> 
     </s:element> 
     <s:complexType name="ArrayOfReceipt"> 
     <s:sequence> 
      <s:element minOccurs="0" maxOccurs="unbounded" name="Receipt" nillable="true" type="tns:Receipt" /> 
     </s:sequence> 
     </s:complexType> 
     <s:complexType name="Receipt"> 
     <s:sequence> 
      <s:element minOccurs="1" maxOccurs="1" name="OrderID" type="s:int" /> 
      <s:element minOccurs="1" maxOccurs="1" name="TotalSaleAmount" type="s:decimal" /> 
      <s:element minOccurs="1" maxOccurs="1" name="TaxCollectorFees" type="s:decimal" /> 
      <s:element minOccurs="1" maxOccurs="1" name="OrderDate" type="s:dateTime" /> 
      <s:element minOccurs="0" maxOccurs="1" name="OrderStatus" type="s:string" /> 
      <s:element minOccurs="1" maxOccurs="1" name="AmountToACH" type="s:decimal" /> 
      <s:element minOccurs="1" maxOccurs="1" name="CustomerID" type="s:int" /> 
      <s:element minOccurs="0" maxOccurs="1" name="CustomerName" type="s:string" /> 
      <s:element minOccurs="0" maxOccurs="1" name="ClerkUserName" type="s:string" /> 
      <s:element minOccurs="0" maxOccurs="1" name="TarponTagBegin" type="s:string" /> 
      <s:element minOccurs="0" maxOccurs="1" name="TarponTagEnd" type="s:string" /> 
      <s:element minOccurs="0" maxOccurs="1" name="ErrorMessage" type="s:string" /> 
     </s:sequence> 
     </s:complexType> 
    </s:schema> 
    </wsdl:types> 
    <wsdl:message name="getDailyReceiptsSoapIn"> 
    <wsdl:part name="parameters" element="tns:getDailyReceipts" /> 
    </wsdl:message> 
    <wsdl:message name="getDailyReceiptsSoapOut"> 
    <wsdl:part name="parameters" element="tns:getDailyReceiptsResponse" /> 
    </wsdl:message> 
    <wsdl:portType name="wsReceiptsSoap"> 
    <wsdl:operation name="getDailyReceipts"> 
     <wsdl:input message="tns:getDailyReceiptsSoapIn" /> 
     <wsdl:output message="tns:getDailyReceiptsSoapOut" /> 
    </wsdl:operation> 
    </wsdl:portType> 
    <wsdl:binding name="wsReceiptsSoap" type="tns:wsReceiptsSoap"> 
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http" /> 
    <wsdl:operation name="getDailyReceipts"> 
     <soap:operation soapAction="http://api.outdoorlicensesolution.com/RLIS/getDailyReceipts" style="document" /> 
     <wsdl:input> 
     <soap:body use="literal" /> 
     </wsdl:input> 
     <wsdl:output> 
     <soap:body use="literal" /> 
     </wsdl:output> 
    </wsdl:operation> 
    </wsdl:binding> 
    <wsdl:binding name="wsReceiptsSoap12" type="tns:wsReceiptsSoap"> 
    <soap12:binding transport="http://schemas.xmlsoap.org/soap/http" /> 
    <wsdl:operation name="getDailyReceipts"> 
     <soap12:operation soapAction="http://api.outdoorlicensesolution.com/RLIS/getDailyReceipts" style="document" /> 
     <wsdl:input> 
     <soap12:body use="literal" /> 
     </wsdl:input> 
     <wsdl:output> 
     <soap12:body use="literal" /> 
     </wsdl:output> 
    </wsdl:operation> 
    </wsdl:binding> 
    <wsdl:service name="wsReceipts"> 
    <wsdl:port name="wsReceiptsSoap" binding="tns:wsReceiptsSoap"> 
     <soap:address location="https://rlisapi.myfwc.com/wsReceipts.asmx" /> 
    </wsdl:port> 
    <wsdl:port name="wsReceiptsSoap12" binding="tns:wsReceiptsSoap12"> 
     <soap12:address location="https://rlisapi.myfwc.com/wsReceipts.asmx" /> 
    </wsdl:port> 
    </wsdl:service> 
</wsdl:definitions> 

tôi cũng sẽ cung cấp cho bạn với mã FoxPro rằng hoạt động:

******************************************* 
SALEDATE = DATE()-1 
XMLRESPONSE = '' 

M.AGENTID = '000' 
M.APIKEY = 'my-consumer-pin' 

M.cSALEDATE = STR(YEAR(SALEDATE),4) + '-' + PADL(ALLTRIM(STR(MONTH(SALEDATE),2)),2,'0') + '-' + PADL(ALLTRIM(STR(DAY(SALEDATE),2)),2,'0') + 'T00:00:00' 

TEXT TO XMLHTTP NOSHOW 
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://www.w3.org/2003/05/soap-envelope"> 
<soap:Body> 
<getDailyReceipts xmlns="http://api.outdoorlicensesolution.com/RLIS/"> 
<Content-Length>494</Content-Length> 
<ConsumerPIN>APIKEY</ConsumerPIN> 
<AgentID>AGENTID</AgentID> 
<ReceiptDate>SALEDATE</ReceiptDate> 
</getDailyReceipts> 
</soap:Body> 
</soap:Envelope> 
ENDTEXT 
XMLHTTP = STRTRAN(XMLHTTP,'APIKEY',M.APIKEY) 
XMLHTTP = STRTRAN(XMLHTTP,'AGENTID',M.AGENTID) 
XMLHTTP = STRTRAN(XMLHTTP,'SALEDATE',M.cSALEDATE) 



oHTTP = CreateObject("Microsoft.XMLHTTP") 
oHTTP.Open("POST", "https://rlisapi.myfwc.com/wsReceipts.asmx", .F.) 

oHTTP.setRequestHeader('Content-Type', 'text/xml; charset=utf-8 ') 
oHTTP.Send(XMLHTTP) 


DO CASE 
CASE oHTTP.status = 200 
       XMLRESPONSE = oHTTP.ResponseText 
       RELEASE oHTTP 
CASE oHTTP.status = 201 
       WAIT'PROCESSING PLEASE WAIT' WINDOW NOWAIT 
       RELEASE oHTTP 
CASE oHTTP.status = 202 
       WAIT 'PROCESSING PLEASE WAIT' WINDOW NOWAIT 
       RELEASE oHTTP 
CASE oHTTP.status = 400 
       RELEASE oHTTP 
       MESSAGEBOX("RLIS BAD REQUEST ERROR",0,'CCARS') 
       RETURN 
CASE oHTTP.status = 401 
       RELEASE oHTTP 
       MESSAGEBOX("RLIS UNAUTHORIZED ERROR",0,'CCARS') 
       RETURN 
CASE oHTTP.status = 403 
       RELEASE oHTTP 
       MESSAGEBOX("RLIS FORBIDDEN ERROR",0,'CCARS') 
       RETURN 
CASE oHTTP.status = 404 
       RELEASE oHTTP 
       MESSAGEBOX("CONNECTION TO RLIS SITE NOT AVAILABLE",0,'CCARS') 
       RETURN 
CASE oHTTP.status = 500 
       RELEASE oHTTP 
       MESSAGEBOX("RLIS INTERNAL SERVER ERROR",0,'CCARS') 
       RETURN 
OTHERWISE 
       RELEASE oHTTP 
       MESSAGEBOX(oHTTP.status,0,'CCARS') 
       MESSAGEBOX("RLIS INTERNAL SERVER ERROR CODE " + STR(oHTTP.status,3,0),0,'CCARS') 
       RETURN 
ENDCASE 

MESSAGEBOX(XMLRESPONSE) 

Đây là toàn bộ lỗi ngăn xếp của lỗi:

java.net.SocketException: Connection reset 
at java.net.SocketInputStream.read(SocketInputStream.java:168) 
at com.sun.net.ssl.internal.ssl.InputRecord.readFully(InputRecord.java:422) 
at com.sun.net.ssl.internal.ssl.InputRecord.read(InputRecord.java:460) 
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:863) 
at  com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1188) 
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1215) 
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1199) 
at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:434) 
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:166) 
at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1014) 
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:230) 
at com.taxcollector.ccars.service.transaction.TestSoapClient.main(TestSoapClient.java:51) 

Từ tất cả các nghiên cứu của tôi trong vài ngày qua, điều tôi đã xác định là do máy chủ đóng kết nối trước máy khách nhất đang đọc xong.

Lúc đầu, tôi nghĩ rằng có điều gì đó không ổn với chính dịch vụ web, nhưng vì tôi có thể chạy lệnh foxpro và nhận được phản hồi hợp lệ, điều đó không thể xảy ra.

Tôi đã thử thay đổi nhiều tùy chọn trong cài đặt Giao diện người dùng xà phòng quá, bao gồm hết thời gian chờ của ổ cắm.

Ngoài ra, yêu cầu của tôi không đi qua máy chủ proxy.

Bất kỳ đề xuất hoặc lời khuyên nào sẽ được đánh giá rất nhiều! Cảm ơn bạn.


CẬP NHẬT POST SAU


Dưới đây là ảnh chụp từ Wireshark, ACK đơn giản bỏ qua.

4034 2013-07-05 10:34:04.556901000 192.168.0.106 162.209.25.202 SSLv2 178 Client Hello 
4038 2013-07-05 10:34:04.669714000 162.209.25.202 192.168.0.106 SSLv3 1386 Server Hello, Certificate, Server Hello Done 
4040 2013-07-05 10:34:04.880678000 192.168.0.106 162.209.25.202 SSLv3 331 Client Key Exchange 
4041 2013-07-05 10:34:04.885161000 192.168.0.106 162.209.25.202 SSLv3 72 Change Cipher Spec 
4042 2013-07-05 10:34:04.887886000 192.168.0.106 162.209.25.202 SSLv3 127 Encrypted Handshake Message 
4045 2013-07-05 10:34:05.142999000 162.209.25.202 192.168.0.106 TCP 54 https > 58365 [RST, ACK] Seq=2769 Ack=445 Win=4584 Len=0 

Sau đó, chuỗi thư lặp lại.

Vì vậy, tôi nghĩ điều này cho thấy rằng trước tiên có một yêu cầu kết nối được thực hiện từ máy khách, được máy chủ thừa nhận. Sau đó có một Client Hello, một Server Hello, Handshake Protocol Certificate, Server Hello Done, Client Key Exchange, Change Cipher Spec, Message Handshake được mã hóa và cuối cùng là Connection Reset (RST) từ máy chủ.

Tôi đã tra cứu thông tin Chuyên gia về khung cuối cùng có nghĩa là gì và có vẻ như nó có thể có nghĩa là chuỗi giao thức đáng ngờ, ví dụ: trình tự không liên tục hoặc phát lại được phát hiện ...

Điều này vẫn khiến tôi gãi đầu! Tôi không hiểu những gì tôi có thể làm trong mã của tôi, hoặc từ giao diện người dùng Soap có thể gây ra kết nối này thiết lập lại từ máy chủ. Và tại sao nó không xảy ra từ bài đăng Microsoft.XMLHTTP trong mã foxpro ... Có thể yêu cầu của tôi được gửi dưới dạng phân đoạn và máy chủ sẽ không chấp nhận điều đó?

Tôi nghĩ rằng tôi sẽ cố gắng chạy một capture wireshark trong khi chạy lệnh foxpro, nhưng đó là trên một máy tính với Windows 8, vì vậy tôi cần phải đầu tiên tìm ra cách để chạy nó dưới admin. Các khách hàng thử nghiệm java tôi đang chạy mà được một thiết lập lại kết nối là trên mac của tôi.

Trong thời gian chờ đợi, có ai có thêm thông tin chi tiết nào không?

Trả lời

7

Như tôi thấy, tất cả các ví dụ của bạn sẽ hoạt động bình thường.

Tôi khuyên bạn sử dụng một số phần mềm theo dõi gói, như wireshark hoặc fiddler và kiểm tra các tiêu đề yêu cầu/phản hồi. Có thể có một số thông tin bổ sung (UserAgent, v.v.) mà bạn cần đặt trên kết nối trước khi yêu cầu OutputStream

================ UPDATE ====== ================

Như bạn đã chỉ định, máy chủ yêu cầu bạn bật SSLv3. Sử dụng này trước khi thiết lập kết nối

System.setProperty("https.protocols", "SSLv3"); 

Tôi đã làm điều này trong thử nghiệm của tôi, và nó dường như kết nối kể từ khi tôi có thể viết thông điệp xà phòng vào luồng OutputStream, nhưng tôi có một Lỗi 500 từ máy chủ, mà là một tốt điều vì đó là một werbservice lỗi nội

Bây giờ bạn cần phải tìm những gì là sai trong thông điệp xà phòng, hoặc các thông điệp dữ liệu

CẬP NHẬT ================ 2 ======================

Đã sửa lỗi!

Để làm rõ, tôi đang sử dụng số kiểm tra 4 (HttpUrlConnection)

Theres một không gian thiếu vào cuối dòng thứ 3 của thông điệp

"<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"" + 

nên

"<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" " + 

nguyên nhân được liên kết với định nghĩa xmlns:xsd.

tôi nhận được phản ứng này

<?xml version="1.0" encoding="utf-8"?> 
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <soap:Body> 
     <getDailyReceiptsResponse xmlns="http://api.outdoorlicensesolution.com/RLIS/"> 
      <getDailyReceiptsResult> 
       <Receipt> 
        <OrderID>0</OrderID> 
        <TotalSaleAmount>0</TotalSaleAmount> 
        <TaxCollectorFees>0</TaxCollectorFees> 
        <OrderDate>0001-01-01T00:00:00</OrderDate> 
        <AmountToACH>0</AmountToACH> 
        <CustomerID>0</CustomerID> 
        <ErrorMessage>Invalid Logon Credentials</ErrorMessage> 
       </Receipt> 
      </getDailyReceiptsResult> 
     </getDailyReceiptsResponse> 
    </soap:Body> 
</soap:Envelope> 
+0

Cảm ơn bạn đã gợi ý. Tôi đã cài đặt wireshark và tôi đang cố gắng hết sức để hiểu những gì mỗi dấu vết gói tin đang nói. Có lẽ bạn hoặc ai đó có nhiều kinh nghiệm hơn tôi với các gói sniffing có thể cung cấp một số thông tin chi tiết. Ngoài ra, tôi đã kiểm tra trước đó với khách hàng của tôi nếu có bất kỳ thông tin đăng nhập người dùng khác cần thiết trong yêu cầu, và ông nói với tôi không. Khách hàng của tôi không phải là chủ sở hữu của dịch vụ web, nhưng là tác giả gốc của ứng dụng khách chuyên nghiệp mà tôi được giao nhiệm vụ chuyển đổi sang một ứng dụng web java. Tôi đang thêm các mục theo dõi từ wireshark vào bài đăng của tôi ở trên. Tôi đánh giá cao sự giúp đỡ của bạn! –

+0

Tôi đã sử dụng mã của bạn, có vẻ OK và tôi có thể tạo lại sự cố. Có thể có một số xác minh máy khách trên phía máy chủ (webservice) vì kết nối SSL là OK, nhưng đã được đặt lại, có thể do máy chủ web không nhận ra máy khách ..? –

+1

Tôi chạy theo dõi từ máy của tôi trong khi chạy trình khách Foxpro. Một sự khác biệt đáng chú ý là giao thức từ máy khách đến máy chủ trên tin nhắn Client Hello ban đầu là sslv3, trong khi từ máy khách java của tôi nó là sslv2, thì tất cả các tin nhắn khác được gửi qua sslv3. Tôi tự hỏi liệu sự không thống nhất có được coi là đáng ngờ bởi máy chủ hay không ... –

Các vấn đề liên quan