亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

我如何使用從使用 php 和 Soap 的抽象復雜類型派生的復雜類型

我如何使用從使用 php 和 Soap 的抽象復雜類型派生的復雜類型

PHP
慕勒3428872 2023-04-21 15:15:35
我最近開始使用 SOAP,但發現很難理解抽象復雜類型的使用。我正在嘗試向 wsdl 發出請求,但我一直收到錯誤消息。'指定的類型是抽象的:name="HomeAffairsIDVRequestedBase"。我的 php 如下:$result = $this->soap->__soapCall('PlaceRequest',array('PlaceRequest'=>                                               array('request' =>                                                   array(                                                            'type'=> 'tns:HomeAffairsIDVStandardRequest',                                                            "IsBatchSearch"=>false,                                                            "ParentRequestId"=>0,                                                            "Reference"=>'test',                                                            "Requester"=>'axxess',                                                            "SessionId"=>'true',                                                            "IdNumber"=>$this->idNumber                                                            ))));目標 wsdl 部分如下<s:element name="PlaceRequest">    <s:complexType>        <s:sequence>            <s:element minOccurs="0" maxOccurs="1" name="request" type="tns:HomeAffairsIDVRequestBase"/>        </s:sequence>    </s:complexType></s:element><s:complexType name="HomeAffairsIDVRequestBase" abstract="true">    <s:sequence>        <s:element minOccurs="1" maxOccurs="1" name="IsBatchSearch" type="s:boolean"/>        <s:element minOccurs="1" maxOccurs="1" name="ParentRequestId" nillable="true" type="s:int"/>        <s:element minOccurs="0" maxOccurs="1" name="Reference" type="s:string"/>        <s:element minOccurs="0" maxOccurs="1" name="Requester" type="s:string"/>        <s:element minOccurs="1" maxOccurs="1" name="SessionId" nillable="true" type="s1:guid"/>    </s:sequence>注意:我無法編輯 wsdl。
查看完整描述

1 回答

?
慕婉清6462132

TA貢獻1804條經驗 獲得超2個贊

您可以從 wsdl 讀取復雜類型定義作為 php 類定義。每個復雜類型都是一個 php 值對象。抽象復雜類型是抽象的值對象,可以從中繼承。


由于我們定義了復雜類型,我們可以構建我們的 php 類。


abstract class HomeAffairsIDVRequestBase 

{

    protected bool $IsBatchSearch;

    protected int $ParentRequestId;

    protected ?string $Reference;

    protected ?string $Requester;

    protected string $SessionId;


    public function getIsBatchSearch(): bool

    {

        return $this->IsBatchSearch;

    }


    public function setIsBatchSearch(bool $isBatchSearch): self

    {

        $this->isBatchSearch = $isBatchSearch;

        return $this;

    }


    public function getParentRequestId(): int

    {

        return $this->ParentRequestId;

    }


    public function setParentRequestId(int $parentRequestId): self

    {

        $this->ParentRequestId = $parentRequestId;

        return $this;

    }


    public function getReference(): ?string

    {

        return $this->Reference;

    }


    public function setReference(string $reference): self

    {

        $this->Reference = $reference;

        return $this;

    }


    public function getRequester(): ?string

    {

        return $this->Requester;

    }


    public function setRequester(string $requester): self

    {

        $this->Requester = $requester;

        return $this;

    }


    public function getSessionId(): string

    {

        return $this->SessionId;

    }


    public function setSessionId(string $sessionId): self

    {

        $this->SessionId = $sessionId;

        return $this;

    }

}

這是我們作為抽象 php 類的第一個抽象復雜類型定義HomeAffairsIDVRequestBase。如您所見,抽象類具有所有屬性,這些屬性在 wsdl 文件中為此復雜類型定義。除此之外,我們還有 getter 和 setter 方法來更好地處理類屬性。


當我們查看 for 的定義時HomeAffairsIDVStandardRequest,我們可以看到它繼承自HomeAffairsIDVRequest. 考慮到這一點,我們必須編寫更多的 php 類。


abstract class HomeAffairsIDVRequest extends HomeAffairsIDVRequestBase 

{

    protected ?string $IdNumber;


    public function getIdNumber(): ?string

    {

        return $this->IdNumber;

    }


    public function setIdNumber(?string $idNumber): self

    {

        $this->IdNumber = $idNumber;

        return $this;

    }

}


class HomeAffairsIDVStandardRequest extends HomeAffairsIDVRequest

{


}

由于其中一種復雜類型HomeAffairsIDVStandardRequest不是HomeAffairsIDVAdvancedRequest抽象的,因此可以將此類用于請求。請記住,抽象 php 類不能直接初始化。wsdl 中的抽象復雜類型也是如此。


現在我們需要將請求元素作為一個類。這是我們 soap 請求中的父元素。該PlaceRequest元素只有一個屬性,稱為request。由于此元素是 的繼承HomeAffairsIDVRequestBase并且此定義是抽象的,因此我們必須稍后在請求中使用類型屬性。


class PlaceRequest 

{

    protected HomeAffairsIDVRequestBase $request;


    public function getRequest(): HomeAffairsIDVRequestBase

    {

        return $this->request;

    }


    public function setRequest(HomeAffairsIDVRequestBase $request): self

    {

        $this->request = $request;

        return $this;

    }

}

到目前為止,我們將數據結構作為 PHP 值對象。到目前為止,這就是我們所需要的?,F在讓我們看一下可能的請求。


try {

    $wsdl = 'https://path.to.your.wsdl.file.com?wsdl';

    $client = new SoapClient($wsdl, [

        'exceptions' => true,

        'trace' => true,

    ]);


    // initialize our value object

    $standard = (new HomeAffairsIDVStandardRequest())

        ->setIsBatchSearch(false)

        ->setParentRequestId(0)

        ->setReference('test')

        ->setRequester('requester')

        ->setSessionId('true')

        ->setIdNumber($idNumber);


    // initialize our request element

    $request = (new PlaceRequest())

        ->setRequest($standard);


    $response = $client->placeRequest($request);

} catch (SoapFault $fault) {

    // error handling like var_dump($fault)

}

由于我沒有看到完整的 wsdl 內容,所以我不能說請求 XML 應該是什么樣子。上面顯示的結果可能會導致 soap 故障。在這種情況下,請嘗試以下示例。


更改類中的類型提示PlaceRequest。


class PlaceRequest 

{

    protected SoapVar $request;


    public function getRequest(): SoapVar

    {

        return $this->request;

    }


    public function setRequest(SoapVar $request): self

    {

        $this->request = $request;

        return $this;

    }

}

之后使用該實例創建一個新的 SoapVar 實例$standard。


// we 've already defined the $standard object above (sets an type attribute for the request node)

$standard = new SoapVar($standard, SOAP_ENC_OBJECT, 'HomeAffairsIDVStandardRequest', 'http://your.namespace.tld/namespace', 'request', 'http://your.namespace.tld/namespace');


// initialise the request element and set the soap var parameter

$request = (new PlaceRequest())

    ->setRequest($standard);


// send it via soap client

$client->PlaceRequest($request);

作為附加信息,您應該始終查看發送的 xml 和接收到的 xml,以便更好地了解錯誤處理。我們trace在初始化 soap 客戶端時設置了選項。這使我們能夠看到最后的請求和最后的響應是什么。


...

} catch (SoapFault $fault) {

    if ($client) {

        // get last request

        var_dump($client->__getLastRequest());


        // get last response

        var_dump($client->__getLastResponse());

    }

}


查看完整回答
反對 回復 2023-04-21
  • 1 回答
  • 0 關注
  • 124 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號