gpt4 book ai didi

使用类型映射选项的 PHP SoapClient 示例

转载 作者:行者123 更新时间:2023-12-03 01:26:02 25 4
gpt4 key购买 nike

我在 PHP 的 SoapClient 中使用命名空间时遇到了一个小问题。从文档中我相信构造函数的类型映射选项将解决我的问题。

http://php.net/manual/en/soapclient.soapclient.php

我只是还没有找到其用法的可靠示例。

有人有例子吗?

最佳答案

这是一个取自测试源的简单示例,其中添加了我的注释:

SOAP 请求

<env:Envelope xmlns:env=\"http://schemas.xmlsoap.org/soap/envelope/\"
xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"
xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"
xmlns:enc=\"http://schemas.xmlsoap.org/soap/encoding/\"
xmlns:ns1=\"http://schemas.nothing.com\"
>
<env:Body>
<ns1:dotest>
<book xsi:type=\"ns1:book\">
<a xsi:type=\"xsd:string\">foo</a>
<b xsi:type=\"xsd:string\">bar</b>
</book>
</ns1:dotest>
</env:Body>
<env:Header/>
</env:Envelope>";

代码

// data object class
class book{
public $a="a";
public $b="c";
}

// XML transform callback function (for converting the "type" into an object)
function book_from_xml($xml) {
$sxe = simplexml_load_string($xml);
$obj = new book;
$obj->a = (string)$sxe->a;
$obj->b = (string)$sxe->b;
return $obj;
}

// SOAP action class (called by soap handle() method)
class test
{
function dotest($book)
{
$classname=get_class($book);
return "Object: ".$classname. "(".$book->a.",".$book->b.")";
}
}

// SOAPServer Instantiation
$options=Array(
'actor' =>'http://schemas.nothing.com',
'typemap' => array(
array(
// type namespaces have to match those declared in the WSDL
'type_ns' => 'http://schemas.nothing.com',
'type_name' => 'book',
'from_xml' => 'book_from_xml',
),
// additional typemap definition arrays go here
)
);
$server = new SoapServer(dirname(__FILE__)."/classmap.wsdl",$options);
$server->setClass("test");
$server->handle($HTTP_RAW_POST_DATA);

Source Reference File

有用但重要的注释

  1. 输入类型映射必须定义了 from_xml 回调,否则您将收到段错误。
  2. 输出类型映射必须定义了 to_xml 回调,否则您将收到段错误。
  3. type_ns 命名空间值必须与 WSDL 中定义的文字命名空间匹配,否则不会发生类型匹配。
  4. 回调可能比上面示例中使用的简单函数回调更复杂。支持类/对象方法。见下文。

复杂回调

当使用对象或类方法进行回调时,您需要确保使用类的 FQCN(如果您使用命名空间),并且 a) 将您的回调方法声明为 public static 如果您不想实例化实例或 b) 首先创建对象的实例并使用其方法作为回调。

以下是类型映射数组中更复杂的回调的一些示例:

静态类方法调用
...
array(
// type namespaces have to match those declared in the WSDL
'type_ns' => 'http://schemas.nothing.com',
'type_name' => 'book',
// myStaticCallbackMethod must be a public static function of MyClass
'from_xml' => array('\My\Name\Space\MyClass', 'myStaticCallbackMethod'),
),

或者对于 PHP 版本 PHP 5.2.3 及更高版本:

array(
// type namespaces have to match those declared in the WSDL
'type_ns' => 'http://schemas.nothing.com',
'type_name' => 'book',
// myStaticCallbackMethod must be a public static function of MyClass
'from_xml' => array('\My\Name\Space\MyClass::myStaticCallbackMethod'),
),

类定义:

namespace My\Name\Space;

class MyClass
{
public static function myStaticCallbackMethod($xml)
{
// do something
}
}
对象方法调用
$obj = new \My\Name\Space\MyClass();
...
// static class method call
array(
// type namespaces have to match those declared in the WSDL
'type_ns' => "http://schemas.nothing.com",
'type_name' => 'book',
'from_xml' => array($obj, 'myCallbackMethod'),
),

类定义:

namespace My\Name\Space;

class MyClass
{
public function myCallbackMethod($xml)
{
// do something
}
}
关闭
$myCallback = function($xml) {
// do something
};
...
// static class method call
array(
// type namespaces have to match those declared in the WSDL
'type_ns' => 'http://schemas.nothing.com',
'type_name' => 'book',
'from_xml' => $myCallback,
),

关于使用类型映射选项的 PHP SoapClient 示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4807171/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com