7

私は PHP を使用しており、PHP にバンドルされている SOAP クラスを使用しています。なぜこれが機能しないのかを理解するために一日中費やしました。

クライアント側でこれを書きました:

 $client = new SoapClient("Audit.wsdl");                              
 $params=array('SerialNumber'=>'PB4LAX6JLJT7M','PercentProgress'=>'50','ResultID'=>'5');
 $result=$client->__soapCall('HardDriveStatusUpdate',array($params));

次に、サーバー側でこれを書きました:

function HardDriveStatusUpdate($sn, $p, $rs)
{
    $serialNumber=$sn->SerialNumber;
    $percentProgress=$p->PercentProgress;
    $resultID=$rs->ResultID; 
    // process with variables 
    return array('HardDriveStatusUpdateResult' => '$result');
}

$server=new SoapServer('Audit.wsdl');
$server->addFunction('HardDriveStatusUpdate');
$server->handle();

何も起きていないことに気がつきました。デバッグするために、「$serialNumber, $percentProgress, $resultID」でファイルに書き込む機能がありました。最初の引数だけを取得していたことがわかりましたが、2 番目と 3 番目の引数は空でした。(「PB4LAX6JLJT7M、、」と表示されました)なぜですか?

WSDL は次のように述べています。

 <s:element name="HardDriveStatusUpdate">
    <s:complexType>
      <s:sequence>
        <s:element minOccurs="0" maxOccurs="1" name="SerialNumber" type="s:string" />
        <s:element minOccurs="1" maxOccurs="1" name="PercentProgress" type="s:int" />
        <s:element minOccurs="1" maxOccurs="1" name="ResultID" type="s:int" />
      </s:sequence>
    </s:complexType>
  </s:element>

パラメータの作成方法に何か問題がありましたか?

__getLastRequest() でテスト済み:

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://127.0.0.1/soap/">
     <SOAP-ENV:Body>
         <ns1:HardDriveStatusUpdate>
             <ns1:SerialNumber>PB4LAX6JLJT7M</ns1:SerialNumber>
             <ns1:PercentProgress>50</ns1:PercentProgress>
             <ns1:ResultID>5</ns1:ResultID>
         </ns1:HardDriveStatusUpdate>
     </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

本当の問題は間違いなくサーバー側です。すべてのパラメーターが SOAP 要求で既に送信されているにもかかわらず、関数は引数を取得していません。何故ですか?別の方法を試しましたが、それでも 2 番目の引数を取得できません。FIRST 引数でのみ機能します。

4

4 に答える 4

5

提供したwsdlを使用してコードを試しました。引数は単一のオブジェクトで送信されるため、必要な変更は次のとおりです。

function HardDriveStatusUpdate($myObject)
{
    $serialNumber = $myObject->SerialNumber;
    $percentProgress = $myObject->PercentProgress;
    $resultID = $myObject->ResultID; 
    // process with variables 
    return array('HardDriveStatusUpdateResult' => true);
}

SoapUi(with print_r($myObject); die();)でテストしました。結果は次のとおりです。

ここに画像の説明を入力してください

于 2012-08-21T01:00:57.907 に答える
4

SOAP を学ぼうとしたとき、私は大きな問題に直面しました (知識の拡張以外の理由でなく、本当に感謝しています)。これが私が最終的にそれを実現する方法です:

ステップ 1: PHPClasses.org から PHP2WSDL クラスをダウンロードします。

ステップ 2: 次のコードで WSDL を生成します。 require_once("PHPClasses/PHP2WSDL/WSDLCreator.php");

$test = new WSDLCreator("WSDLTester", "http://localhost/soap/SoapServer/");
//$test->includeMethodsDocumentation(false);

$test->addFile("servicefunctions.php");

$test->addURLToClass("servicefunctions", "http://localhost/soap/SoapServer/server.php");

//$test->ignoreMethod(array("example1_1"=>"getEx"));

$test->createWSDL();
$test->saveWSDL("/path/to/dir/SoapServer/test.wsdl");

上記を wsdl.php というファイルに保存したので、ブラウザでアクセスして wsdl ファイルを生成します。注: 重要なことは、クラスと、作成した SOAP サーバーの URL を addURLToClass の URL として配置することです。これは、サーバーが適切に呼び出されるように wsdl に入るためです。

完全を期すために、ServiceFunctions.php のコードを以下に示します。

class servicefunctions {

    /**
     * stringifies
     *
     * @param string $string
     * @return string
     */
    public function stringify(string $string) {
        return "I took the " . $string . " and stringified it";
    }

    /**
     * Adds two numbers
     *
     * @param int $number1
     * @param int $number2
     * @return string
     */
    public function addify(int $number1,int $number2) {
        $answer = ($number1 + $number2);
        $string = "the answer is " . $answer;
        return (string)$string;
    }

}

コメントを使用して var 型を入力していることに注意してください。これは、PHP2WSDL および結果の wsdl ファイルで使用されます。

次に、これによりサーバーが作成されます。

try {
  $server = new SOAPServer("/home/liam/DevEnv/SoapServer/test.wsdl",array('cache_wsdl'=>WSDL_CACHE_NONE));
  $server->setClass("servicefunctions");
  $server->handle();
  }

catch (SOAPFault $f) {
  print "ERROR".$f->faultstring;
}

そしてこれはクライアントです:

try {
$client = new SoapClient("/home/liam/DevEnv/SoapServer/test.wsdl",array('cache_wsdl'=>WSDL_CACHE_NONE));
echo print_r($client->__getFunctions(),true) . "<br/>";
echo $client->stringify("test new");
}
catch (SOAPFault $f) {
  print "ERROR" . $f->faultstring;
}

出力:

Array ( [0] => string addify(integer $number1, integer $number2) [1] => string stringify(string $string) )
I took the test new and stringified it

これをあなたのクラスに簡単に変換できると確信しています。

于 2012-08-19T11:00:06.650 に答える
0

データを1つのパラメーターとして配列(array($params))として送信します。これは、サーバーが1つのパラメーターのみを受信することを意味します。1つのパラメーターのみを受け入れるように関数のシグネチャを変更するか、関数の呼び出し方法を変更することができます。

一連のキー=>値パラメータを使用して呼び出す場合は、次のように変更できます$params

array(array("SerialNumber" => 'PB4LAX6JLJT7M'), array('PercentProgres' .... ));

そして、を使用して呼び出します$result=$client->__soapCall('HardDriveStatusUpdate',$params);

受信関数では、オブジェクトプロパティ構文を使用してパラメータを取得しようとしていますが、おそらく配列構文を使用する必要があります。$sn["SerialNumber"]

于 2012-08-20T12:35:48.497 に答える
0

解決策に役立つ同様の問題を次に示します。

PHP ソープ サーバー: 呼び出したクラスのソープ リクエスト パラメータにアクセスできません

それが誰かを助けることを願って、

ダニエル

于 2013-08-01T17:17:58.603 に答える