[转]php soap操作
原文: https://www.jianshu.com/p/16b039956cf9
这篇也可以参考:https://blog.csdn.net/benchow168168/article/details/89328401
下面,在windows宿主机上面(192.168.123.149上面,访问其webroot目录下面的client2.php)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <?php try { $client = new SOAPClient(null, [ 'location' => 'http://192.168.123.41:888/server2.php' , 'uri' => 'http://192.168.123.41:888/server2.php' , ]); // 直接调用 echo $client ->strtolink( '192.168.123.41:888' ) . '<br>' ; // 间接调用 // echo $client->__soapCall('strtolink', ['192.168.123.41:888']); } catch (SOAPFault $e ) { echo $e ->getMessage(); } |
tcpdump到192.168.123.41上面抓包
tcpdump tcp port 888 -w soap.pcap
--------------------------------------------------------------------------------------------------------------------
SOAP 简单对象访问协议是交换数据的一种协议规范,是一种轻量的、简单的、基于XML(标准通用标记语言下的一个子集)的协议,它被设计成在WEB上交换结构化的和固化的信息。
SOAP(Simple Object Access Protocol )简单对象访问协议是在分散或分布式的环境中交换信息的简单的协议,是一个基于XML的协议,它包括四个部分:
- SOAP封装(envelop),封装定义了一个描述消息中的内容是什么,是谁发送的,谁-
应当接受并处理它以及如何处理它们的框架; - SOAP编码规则(encoding rules),用于表示应用程序需要使用的数据类型的实例;
- SOAP RPC表示(RPC representation),表示远程过程调用和应答的协定;
- SOAP绑定(binding),使用底层协议交换信息。
优点
- 可扩展的。SOAP 无需中断已有的应用程序, SOAP 客户端、 服务器和协议自身都能发展。而且SOAP 能极好地支持中间介质和层次化的体系结构。
- 简单的。客户端发送一个请求,调用相应的对象, 然后服务器返回结果。这些消息是XML 格式的,并且封装成符合HTTP 协议的消息。因此,它符合任何路由器、 防火墙或代理服务器的要求。
- 完全和厂商无关。SOAP可以相对于平台、 操作系统、 目标模型和编程语言独立实现。另外,传输和语言绑定以及数据编码的参数选择都是由具体的实现决定的。
- 与编程语言无关。SOAP 可以使用任何语言来完成,只要客户端发送正确SOAP 请求( 也就是说, 传递一个合适的参数给一个实际的远端服务器)。SOAP 没有对象模型,应用程序可以捆绑在任何对象模型中。
- 与平台无关。SOAP 可以在任何操作系统中无需改动正常运行。
SOAP有两种操作方式,NO-WSDL 与 WSDL
-
NO-WSDL模式:使用参数来传递要使用的信息
-
WSDL模式: 使用WSDL文件名作为参数,并从WSDL中提取服务所需的信息。(WSDL文件结构在系统迭代频繁的时候,没有NO-WSDL模式灵活,这里暂时不讲.)
SOAP中主要用到三个类,SOAPServer,SOAPClient,SOAPFault.
简单示例:
server.php
<?php
class soapHandle
{
public function strtolink($url = '') {
return sprintf('<a href="%s">%s</a>', $url, $url);
}
}
try {
$server = new SOAPServer(null, ['uri' => 'http://127.0.0.1:8002/demo/soap/NO-WSDL/server.php']);
$server->setClass('soapHandle');
$server->handle();
} catch (SOAPFault $f) {
echo $f->getMessage();
}
client.php
<?php
try {
$client = new SOAPClient(null, [
'location' => 'http://127.0.0.1:8002/demo/soap/NO-WSDL/server.php',
'uri' => 'http://127.0.0.1:8002/demo/soap/NO-WSDL/server.php',
]);
// 直接调用
echo $client->strtolink('www.demo.com') . '<br>';
// 间接调用
echo $client->__soapCall('strtolink', ['www.demo.com']);
} catch (SOAPFault $e) {
echo $e->getMessage();
}
简单示例升级
server.php
<?php
class SOAPHandle
{
public function auth($auth) {
if ($auth->string[0] != 'demo' || $auth->string[1] != '123456') {
throw new SOAPFault('Server', 'No Permission');
}
}
public function strtolink($str = '', $name = '', $openwin = 0) {
$name = $name == '' ? $str : $name;
$openwin_tag = $openwin == 1 ? ' target="_blank" ' : '';
return sprintf('<a href="%s" %s>%s</a>', $str, $openwin_tag, $name);
}
}
$config = array(
'uri' => 'http://127.0.0.1:8002/demo/soap/NO-WSDL-Header/server.php'
);
$objHandle = new SOAPHandle;
// no wsdl mode
try {
$server = new SOAPServer(null, $config);
$server->setObject($objHandle );
$server->handle();
} catch (SOAPFault $f) {
echo $f->faultString;
}
client.php
<?php
$config = [
'location' => 'http://127.0.0.1:8002/demo/soap/NO-WSDL-Header/server.php',
'uri' => 'http://127.0.0.1:8002/demo/soap/NO-WSDL-Header/server.php',
'trace' => true
];
try {
$auth = [
'demo',
'123456'
];
// no wsdl
$client = new SOAPClient(null, $config);
/*
* SoapHeader参数说明如下所示:
* 'http://tempuri.org/' namespace(命名空间可省略)
* 'MySoapHeader' SoapHeader头的类名
* 'array(...)' 存放标识身份的字符串参数
* 'true' 是否必须处理该header
*/
$header = new SOAPHeader('http://127.0.0.1:8002/demo/soap/NO-WSDL-Header/server.php', 'auth', $auth, false, SOAP_ACTOR_NEXT);
$client->__setSoapHeaders([$header]);
$strtolink = $client->__soapCall('strtolink', [
'http://www.demo.com',
'测试网址',
1
]);
echo $strtolink . '<br>';
} catch (SOAPFault $e) {
echo $e->getMessage();
}
参考
浅谈 SOAP
作者:谁不曾年少轻狂过
链接:https://www.jianshu.com/p/16b039956cf9
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
2019-05-06 golang map多层嵌套使用及遍历方法汇总
2019-05-06 golang type conversion
2019-05-06 go结构体组合函数
2019-05-06 【转】golang 结构体和方法
2017-05-06 PHP设计模式——工厂模式
2017-05-06 php设计模式——模板模式
2016-05-06 中午和同事聊天,了解的一点网络方面的东西。