简体   繁体   English

如何为SOAP Client功能创建适当的xml?

[英]How to create proper xml for SOAP Client function?

I've spend hours with SOAPClient and still get no result, hope someone can help me. 我花了几个小时使用SOAPClient仍然没有结果,希望有人可以帮助我。 I'm trying to create and send to web-service following code: 我正在尝试创建并发送到以下代码的Web服务:

POST /PortalServices/PortalServices.asmx HTTP/1.1
Host:***.***.com
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://***.com/CreateUser"

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Header>
    <UserCredentials xmlns="http://***.com/">
      <UserName>string</UserName>
      <PassWord>string</PassWord>
      <ServiceName>string</ServiceName>
    </UserCredentials>
  </soap:Header>
  <soap:Body>
    <CreateUser xmlns="http://***.com/">
      <user>
        <Name>string</Name>
        <Email>string</Email>
        <PassWord>string</PassWord>
        <WsServices>
          <WsService>
            <Id>int</Id>
          </WsService>
        </WsServices>
      </user>
    </CreateUser>
  </soap:Body>
</soap:Envelope>

To get this xml I use the following code: 要获取此xml,我使用以下代码:

<?php

class WsService {
public $Id = "****";
}

class WsServices {
public $WsService;
public function __construct() {
         $this->WsService = new WsService();
        }
}


class WsUser {

public $Name = 'Sasha Lavasov';
public $Email = 'imsashko@gmail.com';
public $PassWord = 'test';
public $WsServices;

public function __construct() {
        $this->WsServices = new WsService();
        }
}

   $ini = ini_set("soap.wsdl_cache_enabled","0");

   $soap_url = 'http://***.***.com/PortalServices/PortalServices.asmx?wsdl';
   $soapClient = new \SoapClient($soap_url, array(
       'soap_version'=>SOAP_1_2,
       'trace' => 1,
       'exceptions' => true,
       'cache_wsdl' => WSDL_CACHE_NONE
       ));

   $hdd = new stdClass();
   $hdd->UserName =   '***';
   $hdd->PassWord = '***';
   $hdd->ServiceName = '***';

   $hd = new SoapVar($hdd, SOAP_ENC_OBJECT);


        $headers = new \SoapHeader('http://***.***.com/PortalServices', 'UserCredentials', $hd);

        // Prepare Soap Client
        $soapClient->__setSoapHeaders(array($headers));

        $user = new WsUser();
        // Setup the CreateUser parameters
        $ap_param = array(
        'Name' => 'Sasha Lavasov',
        'WsUser' => $user
                    );


        $param = new \SoapParam($user, 'WsUser');
        // Call CreateUser ()
        $error = 0;

        try {
        //Build user entity
        $usr  = new WsUser();
        $wsServices = new StdClass();

        $id = new StdClass();
        $id->Id = '***';
        $wsServices->WsService = $id;
        $usr->WsServices = $wsServices;

        $createUser = new stdClass();
        $createUser->user = $usr;

        $createUser = new SoapVar($createUser, SOAP_ENC_OBJECT, "WsUser", "http://***.***.com/PortalServices/PortalServices.asmx?op=CreateUser");

        $pm = new SoapParam($createUser, "user");

        $soapClient->CreateUser($pm);
            //Here I get xml
            var_dump( $soapClient->__getLastRequest()); die();
        } catch (\SoapFault $fault) {
            $error = 1;
            print($fault->faultcode." - ".$fault->faultstring); die();
        }

        if ($error == 0) {
        //             DO SOMETHING
            } else {

            }

         $res = $soapClient->__getLastResponse();
         print_r($res); die();

But instead I get something like this: 但相反,我得到这样的东西:

<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:ns1="http://***.***.com/PortalServices/PortalServices.asmx?op=CreateUser" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns2="http://***.com/" xmlns:ns3="http://***.***.com/PortalServices">
<env:Header>

<ns3:UserCredentials>
<UserName>***</UserName>
<PassWord>***</PassWord>
<ServiceName>***</ServiceName>
</ns3:UserCredentials></env:Header>

<env:Body>
<ns2:CreateUser xsi:type="ns1:WsUser">
<user>
<Name>Sasha Lavasov</Name>
<Email>imsashko@gmail.com</Email>
<PassWord>test</PassWord>
<WsServices><WsService><Id>***</Id></WsService></WsServices>
</user>
</ns2:CreateUser>
</env:Body>
</env:Envelope>

And get FALSE as result. 并得到FALSE结果。 In the list of server's functions (using __getFunctions()) I've got following: 在服务器函数列表中(使用__getFunctions())我有以下内容:

CreateUserResponse CreateUser(CreateUser $parameters)

Can anyone help me or just tell where I'm wrong? 任何人都可以帮助我或只是告诉我哪里错了吗?

Just a suggestion. 只是一个建议。

In your good xml you've: 在你的 xml你有:

<UserCredentials xmlns="http://***.com/">

but in your PHP you set: 但在你的PHP中你设置:

$headers = new SoapHeader('http://***.***.com/PortalServices', 'UserCredentials', $hd);

Then you've 2 different namespaces: http://***.***.com/PortalServices instead of http://***.com/ 然后你有2个不同的命名空间: http://***.***.com/PortalServices而不是http://***.com/

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM