PHP SoapClient : What is NS2

标签 php xml soap soap-client soapserver

我是 web 服务的新手,我正在尝试使用 soapClient() 调用 web 服务,它生成的请求 XML 不是预期的格式

下面是请求XML的预期格式

 <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
    <ns2:EndUserRequest xmlns:ns2="http://www.example.net/EndUserRequest">
        <ns2:companyCode>MD</ns2:companyCode>
        <ns2:customerBranch>60</ns2:customerBranch>
        <ns2:customerNumber>112946</ns2:customerNumber>
        <ns2:endUserName>Some Name</ns2:endUserName>
        <ns2:ContactName />
        <ns2:address />
        <ns2:city />
        <ns2:state />
        <ns2:postalCode />
        <ns2:email />
        <ns2:phoneNumber />
        <ns2:countryCode>US</ns2:countryCode>
    </ns2:EndUserRequest>
</soapenv:Body>
</soapenv:Envelope>

下面是我的代码生成的XML请求

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://www.emaple.com/EndUserRequest">
    <SOAP-ENV:Body>
        <ns1:EndUserRequest xmlns:ns1="http://www.example.net/EndUserRequest">
            <companyCode>MD</companyCode>
            <customerBranchNumber>360</customerBranchNumber>
            <customerNumber>53494711</customerNumber>
            <endUserName>ABCED</endUserName>
            <ContactName></ContactName>
            <address></address>
            <city></city>
            <state></state>
            <postalCode></postalCode>
            <email></email>
            <phoneNumber></phoneNumber>
            <countryCode>US</countryCode>
        </ns1:EndUserRequest>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

下面是我的代码

$client = new SoapClient('https://api-beta.example.com:443/enduser/v1/enduserlist?wsdl', array(
        "trace" => 1,                
        "stream_context" => stream_context_create($streamContext),
        'cache_wsdl' => WSDL_CACHE_NONE
        ));

        $endUserRequest = new stdClass;
        $endUserRequest->companyCode = 'MD';
        $endUserRequest->customerBranchNumber = '560';
        $endUserRequest->customerNumber = '59471321';
        $endUserRequest->endUserName = 'Somename';
        $endUserRequest->ContactName = '';
        $endUserRequest->address = '';
        $endUserRequest->city = '';
        $endUserRequest->state = '';
        $endUserRequest->postalCode = '';
        $endUserRequest->email = '';
        $endUserRequest->phoneNumber = '';
        $endUserRequest->countryCode = 'US';



    $requestSoapVar = new SoapVar($endUserRequest, SOAP_ENC_OBJECT,null,null,'EndUserRequest','http://www.example.com/EndUserRequest');
        $res  = $client->GetEndUsers($requestSoapVar);
        echo '<textarea style="width:600px;height:500px">';
            echo "\n-------Request Header------\n";
            echo $client->__getLastRequestHeaders();
            echo "\n-------Request------\n";
            echo $client->__getLastRequest();
            echo "\n-------Response Header------\n";
            echo $client->__getLastResponseHeaders();
            echo "\n-------Response------\n";
            echo $client->__getLastResponse();
        echo '</textarea>';

        echo '<textarea style="width:600px;height:500px">';
        print_r($res);
        echo '</textarea>';

最佳答案

您的对象的每个成员都必须是一个 SoapVar 对象,因为它们有一个命名空间。只需按照以下示例对您的对象进行编码即可。

$oEndUserRequest = new StdClass();
$oEndUserRequest->companyCode = new SoapVar(
    'MD', 
    XSD_STRING, 
    null, 
    null,
    'companyCode',
    'http://www.example.com/EndUserRequest'
);

只要为每个类(class)成员做这件事,你就会得到预期的结果。

出于高级原因,这里有一个如何更改 namespace 前缀的示例。您必须知道,PHP SoapClient 对象和 SoapVar 对象都可以手动设置命名空间前缀。一般情况下,命名空间不需要设置前缀。

PHP SoapClient 对象有一个 __doRequest 方法,您可以在其中编辑 XML。您必须编写自己的 SoapClient 代码以扩展 PHP SoapClient。

class MySoapClient extends SoapClient {
    public function __doRequest($sRequest, $sLocation, $sAction, $iVersion, $iOneWay = 0) {
        $sRequest = str_replace('ns1', 'ns2', $sRequest);
        $this->__last_request = $sRequest;

        return parent::__doRequest(ltrim($sRequest), $sLocation, $sAction, $iVersion, $iOneWay);
    }
}

在我看来,不必更改 namespace 前缀。如果是这样,请根据您的目的使用 __doRequest 方法。

关于PHP SoapClient : What is NS2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40867569/

相关文章:

php - 查询返回所需的行,直到添加 LIKE

php - 将 php5 模块移植到 php 7 和编译时出现 zend_string 问题

java - Node.getChildNodes() 返回的额外对象是什么?

powershell - 处理来自 powershell 的 SOAP 请求

xml - 为什么 XML Schema 允许 QName 作为元素的值?

java - 在 Java 中使用 WSS4j 对 SOAP 消息进行签名

php - Webapp IP 的 Azure MySQL 连接安全

php - Laravel 8 分页 link() 方法的视觉问题

html - XML 中的 SUP/SUB 标签

php - 将xml转换为json时出现parsererror