2016-12-21 7 views
8

SOAP APIサーバー不要な文字列

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

からの要求を取得しようとしたとき、私は次のPHPコードを実行しています私が得たすべては「私たちのように見えました。 XML文書はありませんでした。

しかし、私はcatchブロックで$ Lastresponse変数を見たとき、私は以下のようにそれを見つけた:

------=_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--

注:私は使用しています$オプションパラメータは次のとおりです。

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

私はxmlを解析するための回避策を講じましたが、余分なものについて誰もが知っていますか?私が間違っていることはありますか?

+1

とは何ですか?例外は何ですか? – alepeino

+0

SOAPサーバーから問題が発生しているようです。サーバーが要求にヘッダーを挿入しています。 – anwerj

+0

phpファイルの開始スペース、つまり<?php before <スペースがあるかどうかを確認しますか? –

答えて

5

これらの-----Partは、hereと説明されているマルチパートメッセージの境界と呼ばれ、RFC2387で定義されています。

調査の結果、SoapClientはマルチパートメッセージを解析できないように見えます。そのため、例外が発生しています。

解決策は、SoapClientを拡張して、正規表現または他の文字列関数を使用してXMLコンテンツを抽出することです。ここ は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()'は低レベルのメソッドで、デバッグのためのものです。 OPは例外が投げられた理由を尋ねています。残念ながら、彼はそれに答えるのに十分な情報を提供していません。 – ThW

2

クエリ

  $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()場合E_ERRORエラーが発生しますlocationおよびuriオプションは、非WSDLモードでは提供されません。

wsdl URIをロードできない場合、SoapFault例外がスローされます。

関連する問題