0

SOAP プロトコルに基づく Web サービスがあります。SOAP は、OO オブジェクト変数を入力として受け取るメソッド Add を提供します。

サービスにデータを追加しようとしています。これはコードです:

// this classes create a structure for WSSE security headers 
class clsWSSEAuth
{
  private $Username;
  private $Password; 
  function __construct($u, $p)
  {
    $this->Username = $u; 
    $this->Password = $p;
  }
}

class clsWSSEToken
{
  private $UsernameToken;
  function __construct($i)
  {
    $this->UsernameToken=$i; 
  }
}    

$params = array('trace' => true);

$user = 'xxxxxx'; 
$pass = base64_encode(sha1('yyyyy', true));  //sha1 is sth like mdf - it codes the pass 

$wssens = 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd';  //namespace

$soapVarUser = new SoapVar ($user, XSD_STRING, NULL, $wssens, NULL, $wssens);
$soapVarPass = new SoapVar ($pass, XSD_STRING, NULL, $wssens, NULL, $wssens);

//PREPARATION OF VARIABLE FO USER AND PASS - END

//Create Object for Auth Class and pass in soap var 
$wsseAuth = new clsWSSEAuth ($soapVarUser, $soapVarPass); 

//Create SoapVar out of object of Auth class 
$soapVarAuth = new SoapVar ($wsseAuth, SOAP_ENC_OBJECT, NULL, $wssens, 'UsernameToken', $wssens);
//Create object for Token Class 
$wsseToken = new clsWSSEToken ($soapVarAuth);
//Create SoapVar out of object of Token class 
$soapVarToken = new SoapVar ($wsseToken, SOAP_ENC_OBJECT, NULL, $wssens, 'UsernameToken', $wssens);
//Create SoapVar for 'Security' node 
$soapHeader = new SoapVar ($soapVarToken, SOAP_ENC_OBJECT, NULL, $wssens, 'Security', $wssens);

//Create header object out of security soapvar 
$header = new SoapHeader($wssens, 'Security', $soapHeader, true, 'htpp://abce.com'); 

//Create object of Soap Client
$client = new SoapClient('https://xxxxxx.support.xxxxxxx.pl:8443/webservices/LAB/LabResultsManagerEP?wsdl', $params);

//Set headers for soapclient object 
$client->__setSoapHeaders($header); 

//definition of example object

class CreateOrderResultListVO {
  public $ord;
  function CreateOrderResultListVO(){
//and some other stuff here too
    $this -> ord = $any_structure_of_objects_maching_required_fields;
  }
}

$test = new CreateOrderResultListVO(); //this is preety much any php OO object

try 
{  
  $id=$client->add($test -> ord);
} catch (Exception $e) { echo "error in add method: <pre>"; var_dump($e);echo "</pre>"; }

Java のクライアントが作成され、正常に動作します。C# のクライアントも同様でした。しかし、私が知る限り、PHP でそれを試みたのは私が初めてです。

実際、メソッド Add に渡されるオブジェクトの構造は複雑ですが (それほど小さな xml ファイルとは一致しません)、明らかにそれは問題ではありません。

var_dump エラーが発生します: オブジェクト構造全体 + これ:

  ["faultstring"]=>
  string(23) "VO object can't be null"
  ["faultcode"]=>
  string(10) "env:Server"
  ["detail"]=>
  object(stdClass)#19 (1) {
    ["ErlabException"]=>
    object(stdClass)#20 (2) {
      ["code"]=>
      string(10) "WRONG_DATA"
      ["message"]=>
      string(23) "VO object can't be null"
    }
  }

つまり、soap接続は問題ありません(get_dataメソッドに同じものがあり、問題なく動作します)が、何らかの理由でメソッド追加は、送信した日付で何もしません。

私は本当にどんな助けにも感謝します。どうすればこれを進めることができますか、または少なくとも何が間違っているのかを探すにはどうすればよいですか?

編集:この助けを願っています:PCからインターネットに送信されるものを聞くためにFiddlerをインストールしました。私はそれで動作するようにFirefoxを設定しました。私が得るのは、ブラウザに表示されるphp Webページのコンテンツだけです。c# および Jave クライアントには、SOAP Add メソッドによって生成された xml 以外は何も表示されません。PHPがSOap Webサービスに正常に接続することはほぼ確実です(エラーがSoap AddエラーではなくSoap serwerエラーでない限り)ので、Fiddlerが何も表示しない理由がわかりません。

4

1 に答える 1

0

誰も本当に知りませんか?:) わかりました、ここにあります。標準の関数呼び出しの代わりにこれを使用します:

  $args = array('soap_parameter_name' => $xml_objects);
  $id = $client->__soapCall('add', array('parameters' => $args)); 
于 2013-03-16T21:21:27.520 に答える