2016-12-21 15 views
8

Tôi đang thực hiện đoạn code sau trong khi cố gắng để có được yêu cầu từ một máy chủ SOAP APIStrings không mong muốn đính kèm trong khi bắt đầu và kết thúc của một phản ứng SOAP trong PHP SoapClient

try { 
    $soap = new SoapClient($wsdl, $options); 
    $data = $soap->GetXYZ($params); 
} 
catch(Exception $e) { 
    $Lastresponse = $soap->__getLastResponse(); 
} 

Tất cả tôi nhận được "trông giống như chúng tôi không có mã phản hồi "tài liệu XML".

Nhưng khi tôi nhìn vào biến $ Lastresponse trong khối catch, tôi thấy nó như sau:

------=_Part_1134075_393252946.1482317378966 Content-Type: application/xop+xml; charset=utf-8; type="text/xml" <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> <SOAP-ENV:Header/> <SOAP-ENV:Body> ......all valid data ... </SOAP-ENV:Body> </SOAP-ENV:Envelope> ------=_Part_1134075_393252946.1482317378966--

Lưu ý: các thông số $ tùy chọn Tôi đang sử dụng là:

$options = array(
    'uri'=>'http://schemas.xmlsoap.org/soap/envelope/', 
    //'style'=>SOAP_RPC, 
    //'use'=>SOAP_ENCODED, 
    'soap_version'=>SOAP_1_1, 
    'cache_wsdl'=>WSDL_CACHE_NONE, 
    'connection_timeout'=>15, 
    'trace'=>true, 
    'encoding'=>'UTF-8', 
    'exceptions'=>true 
); 

Mặc dù tôi đã giải quyết vấn đề này để phân tích cú pháp xml, có ai có bất kỳ ý tưởng nào về những phần bổ sung đó không? Có điều gì tôi đang làm sai?

+1

và ngoại lệ được ném là gì? – alepeino

+0

Sự cố có vẻ là từ Máy chủ SOAP. Máy chủ đang tiêm tiêu đề vào yêu cầu. – anwerj

+0

trong php không gian bắt đầu của tập tin tức là

Trả lời

5

Những thứ -----Part mọi thứ được gọi là ranh giới trong thông điệp nhiều phần được giải thích here và được xác định trong RFC2387.

Sau khi điều tra, có vẻ như SoapClient không có khả năng phân tích cú pháp các thông điệp nhiều phần, đó là lý do tại sao bạn có ngoại lệ đó.

Giải pháp là mở rộng SoapClient để trích xuất nội dung XML bằng chức năng regex hoặc chuỗi khác. Dưới đây là một ví dụ từ this page:

class MySoapClient extends SoapClient { 
    public function __doRequest($request, $location, $action, $version, $one_way = 0) { 
     $response = parent::__doRequest($request, $location, $action, $version, $one_way); 
     $start = strpos($response,'<?xml'); 
     $end = strrpos($response,'>'); 
     return substr($response,$start,$end-$start+1); 
    } 
} 
+0

'__getLastResponse()' là một phương thức mức thấp, nhiều hơn để gỡ lỗi. OP hỏi tại sao ngoại lệ được ném ra. Thật không may là anh ta không cung cấp đủ thông tin để trả lời. – ThW

2

Yêu cầu bạn thử sử dụng dưới đây truy vấn

  $headers = array(
      "POST: ".url." HTTP/1.1", 
      "Host: ".domain."", 
      "Accept-Encoding: gzip,deflate", 
      "Content-type: text/xml;charset=UTF-8", 
      "SOAPAction: \"http://tempuri.org/wsdlurl/methodname\"", 
      "Connection: Keep-Alive", 
      "Content-length:".strlen($xml), 
      "User-Agent: Apache-HttpClient/4.1.1 (java 1.5) 
      " 
      ) 

    $url = your url; 
    $ch = curl_init();  
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); 
    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY); 
    curl_setopt($ch, CURLOPT_TIMEOUT, 10); 
    curl_setopt($ch, CURLOPT_POST, true); 
    curl_setopt($ch, CURLOPT_ENCODING, ''); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, $options); // the SOAP request 
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);  
    $response = curl_exec($ch); 
    $err = curl_error($ch); 
    $doc = new DOMDocument(); 
    $doc->loadXML($response);  
    $authKey = $doc->getElementsByTagName("fieldname"); 
2

You are to catch Exception:

SoapClient :: SoapClient() sẽ tạo ra một lỗi E_ERROR nếu vị trí và các tùy chọn uri không được cung cấp ở chế độ không phải WSDL.

Ngoại lệ SoapFault sẽ bị ném nếu không thể tải URI wsdl.

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