2014-01-15 15 views
5

この問題は、私を壁に押し上げています。私は、PHPとSOAPを使用してWebサービスに接続しようとしています。私は何が間違っているのか分からず、これはまったく新しいサービスであり、その "ドキュメンテーション"は貧しいものです。だから問題は実際に終わりではないのかどうかわかりませんが、確かにそのことを知るには十分なSOAP経験はありません。誰かが私を助けることができるように祈る。複雑なネストされた石鹸パラメータを構造化する方法

XMLをSOAP UIに直接置くことでサービスに接続できましたが、SoapClientを使用しようとするたびにサービスが停止します。私が送信しようとしているXML構造は、次のように見えます。

<Envelope xmlns:ns1="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns2="http://a.uri" xmlns:ns3="http://tempuri.org/"> 
<Body> 
    <GetAuthorization> 
     <ns1:registrationObj ns1:type="ns2:RegistrationAuthorization"> 
      <ns2:Company>####</ns2:Company> 
      <ns2:Computer>####</ns2:Computer> 
      <ns2:Facility>####</ns2:Facility> 
     </ns1:registrationObj> 
    </GetAuthorization> 
</Body> 
</Envelope> 

私はリストにあまりにも多くのアプローチを試みました。 __soapCall、$ client-> method()、SoapVar、およびSoapParamを使用します。全体として、私はPHPのSoapClientのドキュメンテーションが少し疎であることがわかります。しかし、私は(__getLastRequest()経由でダンプされた)

でダンプされた呼び出しの構造を取得することもできません。クライアントが配列の最初の要素を削除し続ける私は、プレーン配列としてのパラメータを渡すしようとするので:。。この例でGetAuthorization自己が最初の配列要素を閉鎖し、落としどのように私は両方経験した

$params = array("Company" => "abc", 
       "Computer" => "def", 
       "Facility" => "ghi"); 
$result = $soap_client->__soapCall('GetAuthorization',$params); 

戻り

<env:Body> 
    <ns1:GetAuthorization/> 
    <param1>def</param1> 
    <param2>ghi</param2> 
</env:Body> 

ノート別々に(そしてそれは私がhavパラメタも正しく命名されるようになりました。私は非常に多くの反復を経て、どのような結果が得られるかを覚えていません。それにもかかわらず、SOAPは私が期待するように動作しません。データを適切にカプセル化したり、ランダムな要素を削除したりすることができません。

$parameters = 
array("ra" => new SoapVar(array(
    "CompanyId" => new SoapVar("####", SOAP_ENC_OBJECT, 'guid', 'http://schemas.microsoft.com/2003/10/Serialization/', 'CompanyId', 'http://schemas.datacontract.org/x/y/z.xx'), 
    "ComputerId" => new SoapVar("{####}", SOAP_ENC_OBJECT, 'string', 'http://www.w3.org/2001/XMLSchema', 'ComputerId', 'http://schemas.datacontract.org/x/y/z.xx'), 
    "FacilityId" => new SoapVar("####", SOAP_ENC_OBJECT, 'guid', 'http://schemas.microsoft.com/2003/10/Serialization/', 'FacilityId', 'http://schemas.datacontract.org/x/y/z.xx') 
), SOAP_ENC_OBJECT, 'RegistrationAuthorization', 'http://schemas.datacontract.org/x/y/z.xx', 'ra', "http://schemas.datacontract.org/x/y/z.xx" 

))); 

$result = $auth_client->GetAuthorization($parameters); 

(私が間違っていたかを把握しようと、それを単純化する前に)私は、パラメータの名前空間を超えるそんなに制御する必要があるので、私がする必要があるだろうと考え出す、もともとを通じてプッシュしようとしていた構造です。しかし、それは単に自己閉鎖要素でリクエストを行います。

誰かが適切なXML構造を生成するために呼び出しをどのように構造化するか教えてください。これがサービス終了時であり、WSDLに何か問題がありますか? (私は、WSDLがバックエンドで何を担当しているか正確にはわかりません)

質問の漠然としたことをお詫びしますが、私は失ってしまったと感じています。 。

+0

()'このメソッドをご紹介、そしておそらくもの関連部分を投稿し ' __getTypes()はそこで使われていますか?(wsdlがpublic /秘密にする必要がない場合は、おそらくそれを共有してください) – Wrikken

+0

残念ながら、WSDLと関連情報は秘密です。本当にそれを含めることを望んでいた。 – dgeare

+0

AH、まあ、それでは:関数の定義なし最初の例は本当にうまくいくようです...バニラの組み込みの 'SoapClient'、あるいはそれを拡張/変更する何か他のものを使用していますか? – Wrikken

答えて

1

:-(それは動作するはずです:

<?php 
$client = new \SoapClient(null, array(
    'uri'   => 'http://localhost/stack/21150482/', 
    'location'  => 'http://localhost/stack/21150482/server.php', 
    'trace'   => true 
)); 
try { 

    $company   = new \SoapVar('XXXXX', XSD_STRING, null, null, 'Company', 'http://a.uri'); 
    $computer  = new \SoapVar('XXXXX', XSD_STRING, null, null, 'Computer', 'http://a.uri'); 
    $facility  = new \SoapVar('XXXXX', XSD_STRING, null, null, 'Facility', 'http://a.uri'); 

    $registrationObj = new \SoapVar(
     array($company,$computer,$facility), 
     SOAP_ENC_OBJECT, 
     'RegistrationAuthorization', 
     'http://a.uri', 
     'registrationObj', 
     'http://www.w3.org/2001/XMLSchema-instance' 
    ); 

    $client->GetAuthorization($registrationObj); 

} catch (\Exception $e) { 
    var_dump($e->getMessage()); 
} 

$dom = new DOMDocument(); 
$dom->preserveWhiteSpace = false; 
$dom->formatOutput = true; 
$dom->loadXML($client->__getLastRequest()); 

print '<pre>'; 
print htmlspecialchars($dom->saveXML()); 

私の結果は次のとおりです。

`__getFunctionsを何
<?xml version="1.0" encoding="UTF-8"?> 
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://localhost/stack/21150482/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns2="http://a.uri" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> 
    <SOAP-ENV:Body> 
    <ns1:GetAuthorization> 
     <xsi:registrationObj xsi:type="ns2:RegistrationAuthorization"> 
     <ns2:Company xsi:type="xsd:string">XXXXX</ns2:Company> 
     <ns2:Computer xsi:type="xsd:string">XXXXX</ns2:Computer> 
     <ns2:Facility xsi:type="xsd:string">XXXXX</ns2:Facility> 
     </xsi:registrationObj> 
    </ns1:GetAuthorization> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 
+0

これは答え間違いなく私をシンクホールから助けました、+1。 – Deegriz

関連する問題