为什么调用webservice接口呢?
- 公司接了一个硬件的项目,硬件项目的接口使用Java的webservice接口技术写的。
什么是webservice?
- Web Services 是应用程序组件
- Web Services 使用开放协议进行通信
- Web Services 是独立的(self-contained)并可自我描述
- Web Services 可通过使用UDDI来发现
- Web Services 可被其他应用程序使用
- XML 是 Web Services 的基础
php调用webservice两种方式
- php的扩展类soap
- php的CURL
什么是soap
soap请求 (Simple Object Access Protocol,简单对象访问协议) 是HTTP POST的一个专用版本,遵循一种特殊的xml消息格式Content-type设置为: text/xml任何数据都可以xml化。
SOAP:简单对象访问协议,简单对象访问协议(SOAP)是一种轻量的、简单的、基于 XML 的协议,它被设计成在 WEB 上交换结构化的和固化的信息。 SOAP 可以和现存的许多因特网协议和格式结合使用,包括超文本传输协议( HTTP),简单邮件传输协议(SMTP),多用途网际邮件扩充协议(MIME)。它还支持从消息系统到远程过程调用(RPC)等大量的应用程序。
小编这里没有使用php的soap,就不对soap做过多的介绍了。
使用curl调用Java的webservice接口
闲言少叙直接上代码
创建curl
function posturl($url,$data){
$headerArray =array("Content-Type: application/soap+xml; charset=utf-8", "Content-length: ".strlen($data));
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST,FALSE);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
curl_setopt($curl,CURLOPT_HTTPHEADER,$headerArray);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($curl);
curl_close($curl);
return $output;
}
利用SoapUI获取webservice接口方法格式
把以上的参数格式复制出来写进写到php里面。
小编在这里极力推荐PHPstorm工具,因为把数据复制进去,PHPstorm工具会帮助我们解析数据。
$url = "http://.cn:17236/vims/services/MobPhoneService?wsdl";
$code = 1000001;
$data = "
<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:web=\"http://webservice.dhsoft.com\">
<soapenv:Header/>
<soapenv:Body>
<web:openDoor>
<!--Optional:-->
<arg0>
{\"deviceCode\":$code}
</arg0>
</web:openDoor>
</soapenv:Body>
</soapenv:Envelope>";
调用一下看看数据,由于用的是http的请求方式,所以webservice返回的数据里面有好多没用的东西,但是直接在浏览器打印的时候看到的只有json串,因为浏览器把xml那部分解析了。
var_dump(posturl($url,$data));
1,返回的数据格式:
string(307) "{"status":"1","resultMessage":"信息发送成功"}"
2,其实是浏览器把xml的部分解析了,下面我们查看源代码看一下真实的数据吧;
string(307) "<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns2:openDoorResponse
xmlns:ns2="http://webservice.dhsoft.com"><openDoor>{"status":"1","resultMessage":"信息发送成功"}
</openDoor></ns2:openDoorResponse></soap:Body></soap:Envelope>"
3,我们看到这不是json数据,怎么办呢,小编在网上费了九牛二虎之力找到了字符串截取的办法。
function get_between($input, $start, $end) {
$str = substr($input, strlen($start)+strpos($input, $start),(strlen($input) - strpos($input, $end))*(-1));
return $str;
}
$data = '{'.get_between(posturl($url,$data),'{','}').'}';
$data_str = str_replace('"','"',$data);
var_dump($data_str);
4,此时我们在使用查看源码的方式,数据格式就是完整的json数据。
string(51) "{"status":"1","resultMessage":"信息发送成功"}"
5,这个时候用json_decode把json转换成数据是轻而易举了。
var_dump(json_decode($data_str));
object(stdClass)#1 (2) {
["status"]=>
string(1) "1"
["resultMessage"]=>
string(18) "信息发送成功"
}
总结
往往我们在调用别的api的时候,数据格式有错误,浏览器是会骗人的,我们要用查看源代码的方式来解析一下真正的数据,小编就是遇到了这个坑。坑了我好几天,明明浏览器打印的就是完整的json的数据,但是使用json_decode就是解析不出来数组。后来查看一下源代码。原来里面藏着那么多的数据。
祝愿小伙伴们遇到这样的坑能及时的爬出来。