PHP调用Java的webservice那些坑

为什么调用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接口方法格式

网上下载soapUI工具

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

把以上的参数格式复制出来写进写到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>{&quot;status&quot;:&quot;1&quot;,&quot;resultMessage&quot;:&quot;信息发送成功&quot;}
	</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('&quot;','"',$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就是解析不出来数组。后来查看一下源代码。原来里面藏着那么多的数据。

祝愿小伙伴们遇到这样的坑能及时的爬出来。

猜你喜欢

转载自blog.csdn.net/zxh7770/article/details/88568229