PHP 中的 Web 服务客户端和服务器演示
6 个完全不同的 Web 服务的演示,也包括 SOAP。
引言
本文演示了不同的 webservice 如何工作。文章面向初学者,因此源代码保持简单。
- 源代码包含 6 个不同的 webservice 客户端和 2 个 webservice 服务器。
- 所有示例均使用 PHP 5 编程,因此可在 Windows 和 Linux 上运行。
- 有些示例通过 GET 发送请求,有些则使用 POST。
- 有些示例通过 URL 发送请求,有些则使用 SOAP。
- 代码不使用任何 PHP Soap 库,因为目的是从零开始展示如何构建和发送 HTTP 请求。
- 此外,本文还展示了如何解析 XML 响应以及如何使用 XPath。
- 示例基于一个可重用的webservice 客户端类。
- 代码的目的是展示 webservice 的基础知识。WSDL 等复杂主题不包含在内。
- 如果您从未用过 PHP,您将在文章末尾找到一个新手教程,介绍如何在 Windows 上安装和运行示例。
阅读本文并研究示例后,您会注意到没有两个 webservice 是完全相同的。它们都具有自己独特的特性。
Webservice 客户端 Yahoo Maps
此示例演示了如何将地址发送到 Yahoo Maps webservice,该服务将返回 GPS 坐标(经度和纬度)。
此 webservice 通过 URL 中的 GET 参数接收参数。
客户端演示了如何使用XPath 从返回的 XML 数据中提取数据。
服务器: http://local.yahooapis.com/MapsService/V1/geocode
请求:
街道 = 701 First Ave, 城市 = New York, 州 = NY
--- 结果 1 --- 精度: address 地址: 701 1st Ave 邮编: 11232 纬度: 40.656335 经度: -74.012770 |
Webservice 客户端 Weather
此示例演示了如何获取世界上 10,000 个城市之一的当前天气数据。
每个城市都由一个城市代码表示(例如,荷兰阿姆斯特丹的 NLXX0002)。
您可以选择以摄氏度、千米、千米/小时和毫巴或华氏度、英里、英里/小时、英寸显示结果。
您还可以获得未来 10 天的逐时或每日天气预报。但为保持示例简单,此处未包含。
此 webservice 通过 URL 中的 GET 参数接收参数。
客户端演示了如何使用XPath 从返回的 XML 数据中提取数据。
服务器: http://xml.weather.com/weather/local
请求:
城市 = NLXX0002, 预报天数 = 0, 单位 = 欧洲
地点: 阿姆斯特丹, 荷兰 本地时间: 下午 5:53 日出: 上午 6:40 日落: 晚上 8:44 经度: 4.90 纬度: 52.35 ![]() 天气: 部分多云
月相: 渐盈眉月 |
Webservice 客户端 Amazon SimpleDB
此 webservice 连接到 Amazon 的数据库 webservice。
在继续阅读之前,请屏住呼吸,忘记您所知道的关于 Amazon 的一切!!此 webservice 与您可以在 Amazon 上购买的任何产品(如书籍、CD 或 DVD)完全无关。
Amazon 提供了一个 webservice,允许您将任何类型的数据存储在他们的 Web 数据库服务器上,您可以在其中创建自己的私有数据库(域)。这样,您就可以编写(Web)应用程序,将数据存储在 Amazon 数据库中。优点是您可以从世界各地访问此数据库,可以存储大量数据(如视频文件),并且 Amazon 提供直接连接到互联网骨干网的快速服务器。显然,此服务不是免费的。
在源代码中,您可以找到订阅的 URL 以及获取您需要的私钥和公钥的 URL。但如果您没有使用有效的账单信息(例如万事达卡)进行订阅,即使您拥有有效的密钥并且每月前 1GB 流量是免费的,您仍然会收到错误。
此示例很有趣,因为它展示了客户端如何进行验证。为了防止其他人使用您付费的帐户,所有对服务器的请求都必须包含用于标识您的公钥,并且所有数据字段必须使用您的私钥进行签名。签名是通过 PHP 命令 hash_hmac()
完成的。
操作“CreateDomain
”将创建一个名为“TestDomain
”的新数据库。
请求还必须发送有效的 UTC 时间戳。如果时间错误,服务器将拒绝请求。数据通过 POST 发送。
请求:
操作 = CreateDomain AWSAccessKeyId = AIWMFIAEQGPKI3LFRADW DomainName = TestDomain SignatureMethod = HmacSHA256 SignatureVersion = 1 Timestamp = 2009-08-25T15:57:40.000Z Version = 2009-04-15 Signature = Xp3QbA4G4Ws41aZ7LX80i8Z4WRqL6LmsIKX9P8DLluY= |
Webservice 客户端 + 服务器数学计算
此示例是客户端和服务器的组合。
它展示了编写 webservice 服务器是多么简单。
服务器和客户端都运行在localhost。
它的功能非常简单:客户端发送一个数学运算(如加法或乘法)和两个数字。
服务器计算结果并将其作为 XML 返回。
数据通过 POST 发送。
Operation = Multiply Value1 = 21 Value2 = 3 |
响应
Result = 63 |
Webservice 客户端 + 服务器字符串操作
此示例与上一个类似,但它使用了SOAP。
客户端发送一个字符串,服务器对其执行一个操作,例如反转字符串或将其转换为大写。
服务器和客户端都运行在localhost。
对于许多 SOAP 服务器,设置 HTTP 头部字段“SOAPAction
”很重要。
您发送一个 XML 文档,其中也可能包含一个 XML 字段“SOAPAction
”,而服务器又要求设置 HTTP 头部,这似乎不合逻辑。
但是,根据服务器的不同,如果缺少此 HTTP 头部,您可能会收到错误。
请求
POST /webservice/Server_Soap.php HTTP/1.0 Host: localhost Content-Type: text/xml; charset=utf-8 Content-Length: 260 SOAPAction: STR_RevertRQ User-Agent: PHP WebService Client <?xml version="1.0"?> |
响应
<?xml version="1.0"?> |
Webservice 客户端 Sabre
Sabre 是一个为旅游业提供航班和酒店数据的 webservice。您可以通过此 webservice 预订航班、酒店和租车。Sabre 是 Open Travel Alliance (OTA) 的成员。
显然,您必须订阅并支付此服务费用。开发人员文档仅对付费客户可用。
服务器: https://webservices.sabre.com/websvc
此示例向服务器发送一个 OTA_PingRQ,这是 OTA 命令列表中最简单的命令。
服务器应响应 OTA_PingRS,该响应会回显相同的字符串。
我从未成功过。如果您知道如何修复它,请给我发电子邮件!
如何在 Windows 上运行示例
- 首先,请检查您的 PC 上是否有任何程序正在使用端口 80 运行服务器。
如果您安装了 Skype,请确保在“工具 -> 选项 -> 连接”菜单下,不要勾选“使用端口 80 和 443 作为传入连接的备用端口”复选框! - 其次,请检查您的浏览器是否配置了 HTTP 代理服务器。如果配置了,请将其关闭!
- 安装 Wamp Server,它将 Apache、mySql 和 PHP 安装到C:\Program Files\Wamp。
- 打开文件 C:\Program Files\Wamp\bin\apache\Apachex.y.z\bin\php.ini
并移除行;extension=php_openssl.dll
前面的分号。 - 之后,从开始菜单启动服务器。您会在系统托盘中看到一个新的图标,您可以单击它以打开配置菜单。
但无需配置任何内容:Wamp 开箱即用。 - 将 CodeProject 的 ZIP 文件中的整个内容复制到文件夹 C:\Program Files\Wamp\www\webservice
- 如果操作正确,此文件将存在:C:\Program Files\Wamp\www\webservice\index.php
- 打开您的浏览器并输入https:///webservice
订阅
对于需要订阅的 webservice,您可以在源代码注释中找到链接和更多信息。