本文旨在为初学者提供一个简单的入门指南,介绍如何使用PHP 5编写Web服务客户端和服务器。示例代码简单易懂,适用于Windows和Linux平台。将通过几个不同的示例,展示如何发送GET和POST请求,使用URL和SOAP,以及如何解析XML响应和使用XPath。
以下是一些Web服务客户端的示例,它们展示了如何与不同的Web服务进行交互。
这个示例展示了如何向Yahoo Maps Web服务发送一个地址,并获取该地址的GPS坐标(经度和纬度)。这个Web服务通过URL的GET方式接收参数。客户端示例展示了如何使用XPath从返回的XML数据中提取数据。
Server: http://local.yahooapis.com/MapsService/V1/geocode
Request: Street=701 First Ave, City=New York, State=NY
Response:
--- RESULT 1 ---
Precision: address
Address: 701 1st Ave
ZIP: 11232
Latitude: 40.656335
Longitude: -74.012770
这个示例展示了如何获取世界上任何一个城市的当前天气数据。每个城市通过一个城市代码来表示(例如,NLXX0002代表荷兰阿姆斯特丹)。可以选择以摄氏度、公里、公里/小时和毫巴或华氏度、英里、英里/小时、英寸来查看结果。此外,还可以获得未来10天内每小时或每天的天气预报,但为了保持示例的简单性,这部分内容并未包含在内。这个Web服务通过URL的GET方式接收参数。客户端示例展示了如何使用XPath从返回的XML数据中提取数据。
Server: http://xml.weather.com/weather/local
Request: City=NLXX0002, Count of forecast days=0, Units=European
Response:
Location: Amsterdam, Netherlands
Local Time: 5:53 PM
Sunrise: 6:40 AM
Sunset: 8:44 PM
Longitude: 4.90
Latitude: 52.35
Sky: Partly Cloudy
Temperature: 18°C
Feels Like: 18°C
Dew Point: 13°C
Pressure: 1010.8 mb
Humidity: 73%
Visibility: 10.0 km
Wind Speed: 21 km/h
Wind Direction: WSW
UV Index: 2
Moon: Waxing Crescent
WeatherStation: Amsterdam, NETHERLANDS
这个Web服务连接到Amazon的数据库Web服务。在继续阅读之前,请暂时忘记所知道的关于Amazon的一切!这个Web服务与在Amazon上购买的书籍、CD或DVD等产品没有任何关系。Amazon提供了一个Web服务,允许将任何类型的数据存储在他们的Web数据库服务器上,可以在那里创建自己的私有数据库(域)。这样,就可以编写(Web)应用程序,将数据存储在Amazon数据库中。这个服务的优势在于可以从世界各地访问这个数据库,可以存储大量数据(如视频文件),而且Amazon提供的服务器速度非常快,直接连接到互联网骨干网。显然,这项服务不是免费的。
在源代码中,可以找到订阅的URL以及获取需要的私钥和公钥的地方。但是,如果没有用有效的付款信息(例如,MasterCard)订阅,即使有有效的密钥,仍然会得到一个错误,尽管第一个月的1GB流量是免费的。
这个示例很有趣,因为它展示了如何验证一个客户端。为了避免其他人使用正在支付的账户,所有发送到服务器的请求必须包含公钥,用以识别自己,然后所有数据字段必须用私钥签名。签名是通过PHP命令hash_hmac()
完成的。
Server: https://sdb.amazonaws.com
Request:
Action=CreateDomain
AWSAccessKeyId=AIWMFIAEQGPKI3LFRADW
DomainName=TestDomain
SignatureMethod=HmacSHA256
SignatureVersion=1
Timestamp=2009-08-25T15:57:40.000Z
Version=2009-04-15
Signature=Xp3QbA4G4Ws41aZ7LX80i8Z4WRqL6LmsIKX9P8DLluY=
这个示例是客户端和服务器的一对。它展示了编写一个Web服务服务器是多么简单。服务器和客户端都在localhost上运行。它所做的非常简单:客户端发送一个数学运算(如加法或乘法)和两个数字。服务器计算结果并以XML格式返回。数据通过POST发送。
Request:
Operation=Multiply
Value1=21
Value2=3
Response:
Result=63
这个示例与前一个类似,只是它使用SOAP。客户端发送一个字符串,服务器执行一个操作,如反转它,或将其转换为大写。服务器和客户端都在localhost上运行。对于许多SOAP服务器来说,设置HTTP头字段"SOAPAction"很重要。发送的XML文档可能也包含一个XML字段"SOAPAction",但服务器还要求设置一个HTTP头,这看起来不太合逻辑。但是,根据服务器的不同,如果这个HTTP头不存在,可能会遇到错误。
Request:
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
This is a little Text
Response:
txeT elttil a si sihT
Sabre是一个为旅游业提供航班和酒店数据的Web服务。可以通过这个Web服务预订航班、酒店和租车。Sabre是开放旅游联盟(OTA)的成员。显然,必须订阅并为此服务付费。开发人员文档仅对付费客户开放。
这个示例向服务器发送一个OTA_PingRQ,这是OTA命令列表中最简单的命令。服务器应该用OTA_PingRS响应回应,将相同的字符串回传。从未让它工作过。如果知道如何修复它,请给发电子邮件!
Server: https://webservices.sabre.com/websvc
首先检查电脑上是否有程序在端口80上运行服务器。如果安装了Skype,请确保在菜单Tools -> Options -> Connection中,复选框"Use Port 80 and 443 as alternatives for incoming connections"未被选中!
其次检查浏览器是否配置了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