如何在PHP中使用Curl调用指定SOAP类型的车辆信息Web Service?
在PHP中使用Curl访问该Web Service的方法
当然可以用Curl来访问这个Web Service啦!这是PHP里处理HTTP请求最常用的工具之一。下面我会一步步给你讲怎么实现,包括构造SOAP请求、配置Curl选项以及解析响应的完整代码:
核心思路
这个API是SOAP类型的Web服务,所以我们需要构造符合SOAP规范的XML请求体,再通过Curl发送POST请求到指定的沙箱URL。
完整代码示例
<?php // 沙箱API地址 $apiUrl = 'http://api.lankagate.gov.lk:8280/GetOnGoingVehicleNoDMT/1.0'; // 设置请求参数:vehicleCategory可选1或4,这里可以根据需求替换 $vehicleCategory = 1; // 构造SOAP请求XML,注意命名空间要和API响应里的保持一致 $soapRequest = <<<XML <?xml version="1.0" encoding="utf-8"?> <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <soap:Body> <GetOnGoingVehicleNoRequest xmlns="http://schemas.conversesolutions.com/xsd/dmticta/v1"> <vehicleCategory>$vehicleCategory</vehicleCategory> </GetOnGoingVehicleNoRequest> </soap:Body> </soap:Envelope> XML; // 初始化Curl会话 $ch = curl_init($apiUrl); // 配置Curl请求选项 curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $soapRequest); // 设置请求头,SOAP服务通常要求Content-Type为text/xml curl_setopt($ch, CURLOPT_HTTPHEADER, [ 'Content-Type: text/xml; charset=utf-8', // 部分SOAP服务需要SOAPAction头,若请求失败可尝试调整或注释掉这一行 'SOAPAction: "http://schemas.conversesolutions.com/xsd/dmticta/v1/GetOnGoingVehicleNo"' ]); // 沙箱环境暂时关闭SSL验证(生产环境请务必开启) curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // 设置返回响应内容而非直接输出 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 执行请求并获取响应 $response = curl_exec($ch); // 检查Curl执行过程中是否出现错误 if(curl_errno($ch)){ echo 'Curl执行错误: ' . curl_error($ch); exit; } // 获取HTTP响应状态码 $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); // 关闭Curl资源 curl_close($ch); // 处理成功响应(状态码200) if($httpCode == 200){ // 解析XML响应内容 $xml = simplexml_load_string($response); // 注册命名空间,方便后续用XPath提取数据 $xml->registerXPathNamespace('soap', 'http://schemas.xmlsoap.org/soap/envelope/'); $xml->registerXPathNamespace('ns', 'http://schemas.conversesolutions.com/xsd/dmticta/v1'); // 提取当前可用车牌号码 $vehicleNo = $xml->xpath('//ns:OngoingVehicleNo')[0]; echo '当前可用车牌: ' . $vehicleNo; // 可选:提取错误码和响应消息(如果存在的话) $errorCode = $xml->xpath('//ns:ErrorCode')[0] ?? null; $responseMsg = $xml->xpath('//ns:ResponseMessage')[0] ?? null; if($errorCode){ echo '<br>错误码: ' . $errorCode; } if($responseMsg){ echo '<br>响应消息: ' . $responseMsg; } } else { echo '请求失败,HTTP状态码: ' . $httpCode; echo '<br>响应内容: ' . $response; } ?>
关键注意事项
- 命名空间匹配:请求XML里的命名空间必须和API响应示例中的一致,否则服务无法正确识别你的请求参数。
- SOAPAction头:部分SOAP服务要求必须携带这个头来指定要调用的方法,如果测试时请求失败,可以检查API文档确认正确的SOAPAction值。
- SSL验证设置:沙箱环境关闭SSL验证是为了测试方便,生产环境请务必开启(将
CURLOPT_SSL_VERIFYPEER设为true,CURLOPT_SSL_VERIFYHOST设为2),避免安全风险。 - XML解析:使用
SimpleXML扩展解析响应时,注册命名空间后,用XPath可以更方便地定位到需要的数据节点。
内容的提问来源于stack exchange,提问作者Sampath Wijesinghe
相关产品推荐
相关产品推荐

