PHP调用WEBSERVICE接口常见问题答疑以及总结
最近的工作项目中,接触到了很多的政府 微信开发项目。对方的外包公司都是使用JAVA作为开发语言,然后通过WEBSERVICE进行接口返回数据到我的项目中。一般情况下,能在浏览器打开并显示数据的接口是直接可以使用 CURL或者file_get_contents进行接收的。但是WEBSERVICE是使用Soapservice。而我们知道,从php 5之后,php自身已经提供了通过 SoapClient 调用webservice的方法。使用方法很简单:
$client = SoapClient('$wsdl'); //也可以使用SoapClient('$wsdl', 'UTF-8')设定特定的编码。
$client->__soapCall($functionName, $params);
调用时可能出现的问题:
1:提示”Class ‘SoapClient’ not found”。
说明没有安装php-SOAP服务。在linux下使用
yum search soap | grep php
如果是Ubuntu系统,可以使用apt-get命令查找soap并安装。
安装完成后,重启apache服务即可。
2:无法传递参数,webservice收到的参数均为null。
原因是webservice限制了提交的参数必须为键值对形式,传递参数时要用
$params = array( 'key'=>'value', 'key2'=>'value2', 'key3'=>'value3' )
的方式。或者将参数声明为一个class,之后使用
$params = array( new class )
进行传递。
这时候你肯定会困惑,这个'key'值用什么名称,这时候,你可以调用下面的脚本,查看下,所有接口函数的参数需要使用什么key值。
<?php
// to see formated types
$soap = new SoapClient('http://domain.com/ws.php?WSDL');
echo '<pre>';
echo '<h2>Types:</h2>';
$types = $soap->__getTypes();
foreach ($types as $type) {
$type = preg_replace(
array('/(\w+) ([a-zA-Z0-9]+)/', '/\n /'),
array('<font color="green">${1}</font> <font color="blue">${2}</font>', "\n\t"),
$type
);
echo $type;
echo "\n\n";
}
echo '</pre>';
此部分参考http://www.php.net/manual/zh/soapclient.soapcall.php的说明。
3:总结:php有两个扩展可以实现web service,一个是NuSoap,一个是php 官方的soap扩展,由于soap是官方的,所以我们这里以soap来实现web service.由于默认是没有打开soap扩展的,所以自己先看一下soap扩展有没有打开。在soap编写web service的过程中主要用到了SoapClient,SoapServer,SoapFault三个类。
SoapClient类
这个类用来使用Web services。SoapClient类可以作为给定Web services的客户端。它有两种操作形式:
- WSDL 模式
- Non-WSDL 模式
在WSDL模式中,构造器可以使用WSDL文件名作为参数,并从WSDL中提取服务所使用的信息。
non-WSDL模式中使用参数来传递要使用的信息。
SoapServer类
这个类可以用来提供Web services。与SoapClient类似,SoapServer也有两种操作模式:WSDL模式和non-WSDL模式。这两种模式的意义跟 SoapClient的两种模式一样。在WSDL模式中,服务实现了WSDL提供的接口;在non-WSDL模式中,参数被用来管理服务的行为。
在SoapServer类的众多方法中,有三个方法比较重要。它们是SoapServer::setClass(),SoapServer::addFunction()和SoapServer::handle()。
下面给出实例:
定义一个提供服务的php类,这个类所提供的函数就是web service对外提供的服务
<?php
Class PersonInfo
{
/**
* 返回姓名
* @return string
*
*/
public function getName(){
return "My Name is Chance";
}
}
?>
下面给出服务器端的代码:
1 <?php
2 //包含提供服务的类进来
3 require_once('PersonInfo.php');
4
5 //wsdl方式提供web service,如果生成了wsdl文件则可直接传递到//SoapServer的构造函数中
6 //$s = new SoapServer('PersonInfo.wsdl');
7
8 //doesn't work 只有location不能提供web service
9 //output:looks like we got no XML document
10 //$s = new SoapServer(null,array("location"=>"http://localhost/Test/MyService/Server.php"));
11
12 //下面两种方式均可以工作,只要指定了相应的uri
13 //$s = new SoapServer(null,array("uri"=>"Server.php"));
14 $s = new SoapServer(null,array("location"=>"http://localhost/Test/MyService/Server.php","uri"=>"Server.php"));
15
16 $s -> setClass("PersonInfo");
17
18 $s -> handle();
19 ?>
下面是客户端代码:
1 <?php
2 try{
3 //wsdl方式调用web service
4 //wsdl方式中由于wsdl文件写定了,如果发生添加删除函数等操作改动,不会反应到wsdl,相对non-wsdl方式
5 //来说不够灵活
6 //$soap = new SoapClient("http://localhost/Test/MyService/PersonInfo.wsdl");
7
8 //non-wsdl方式调用web service
9 //在non-wsdl方式中option location系必须提供的,而服务端的location是选择性的,可以不提供
10 $soap = new SoapClient(null,array('location'=>"http://localhost/Test/MyService/Server.php",'uri'=>'Server.php'));
11
12 //两种调用方式,直接调用方法,和用__soapCall简接调用
13 $result1 = $soap->getName();
14 $result2 = $soap->__soapCall("getName",array());
15 echo $result1."<br/>";
16 echo $result2;
17
18 }catch(SoapFault $e){
19 echo $e->getMessage();
20 }catch(Exception $e){
21 echo $e->getMessage();
22 }
23
24 ?>
http://www.yunxiu.org/blog/article/5534.htm
PHP调用WEBSERVICE接口常见问题答疑以及总结的更多相关文章
- Java调用webservice接口方法
java调用webservice接口 webservice的 发布一般都是使用WSDL(web service descriptive langu ...
- php中创建和调用webservice接口示例
php中创建和调用webservice接口示例 这篇文章主要介绍了php中创建和调用webservice接口示例,包括webservice基本知识.webservice服务端例子.webservi ...
- 使用soapui调用webservice接口
soapui是专门模拟调用webservice接口的工具,下面介绍下怎么使用: 1.下载soapui并安装: 2.以免费天气获取接口为例:http://www.webservicex.net/glob ...
- 使用JS调用WebService接口
<script> $(document).ready(function () { var username = "admin"; var password = &quo ...
- java 调用webservice接口wsdl,推荐使用wsdl2java,放弃wsimport
网上说wsimport是jdk1.6后自带的客户端生成调用webservice接口的工具,其实我挺喜欢原生的东西,毕竟自家的东西用着应该最顺手啊,但往往让人惊艳的是那些集成工具. 本机jdk1.8.1 ...
- js调用Webservice接口案例
第一步:新建Webservice接口 主文件方法 using System;using System.Collections.Generic;using System.Web;using System ...
- SQL调用WebService接口
今天在做一个非常奇葩的东西.中间有个过程要在SQL触发器里面调用webservice接口.呵呵~ ALTER TRIGGER tgr_UpdateMemcached ON dbo.[User] AFT ...
- 动态调用WebService接口的几种方式
一.什么是WebService? 这里就不再赘述了,想要了解的====>传送门 二.为什么要动态调用WebService接口? 一般在C#开发中调用webService服务中的接口都是通过引用过 ...
- ThinkPHP使用soapclient调用webservice接口
1,开启 php.ini 这2个服务 12 extension=php_openssl.dllextension=php_soap.dll 以公共天气预报webservice为例,采用thinkPHP ...
随机推荐
- vc不用IDE编译方法
一个EXE是如何形成的 比如一个源程序有以下两个文件. 1.c 1.rc 首先cl.exe 会把源代码编译为1.obj rc.exe会把1.rc编译为1.res link.exe会把1.obj 1.r ...
- 在C++中调用DLL中的函数 (3)
1.dll的优点 代码复用是提高软件开发效率的重要途径.一般而言,只要某部分代码具有通用性,就可将它构造成相对独立的功能模块并在之后的项目中重复使用.比较常见的例子是各种应用程序框架,ATL.MFC等 ...
- how to extract and decrypt WeChat EnMicromsg.db on Android phone
One of my friend came to me with an Android phone. She saild somehting wrong with the hardware of he ...
- linux mysql开启远程链接
x:\>mysql -u root -pvmware mysql> use mysql; mysql> update user set host = ‘%’ where user = ...
- Windows Phone 开发起步之旅之一 平台环境的搭建
最近大家都在写博客园的技术文章,按耐不住了,也把自己平时学习中遇到和学习到的一些东西写出来,供大家分享也好,自己留个纪念也好,有个可以查看的东西. 言归正传,随着微软对Windows Phone的投入 ...
- 数据库mysql的基本命令
问题分析 当数据量很大的时候,所有数据都集中在一个文本文件中的话,读写会很困难,内存消耗大,速度很慢 操作很麻烦,因为读写都要根据指定的格式尽心解析,不通用 每次获取数据都要全部数据重新读写,不能通过 ...
- 安装minicom串口访问开发板
1. 安装minicom yum install minicom 2. 设置minicom minicom -s 选择“Serial port setup”,将“Serial Device”修改成 ...
- aspx页面与服务器控件间运行原理
一.进入服务器控件以及aspx页面前,必须的准备: a)在WebForm 中只要带有runat="server" 那么那就是一个控件. b)如果form有runat="s ...
- [leetcode]_Binary Tree Inorder Traversal
题目:二叉树的中序遍历. 思路:用递归来写中序遍历非常简单.但是题目直接挑衅说,----->"Recursive solution is trivial".好吧.谁怕谁小狗. ...
- redis的数据类型
redis有string,hash,list,sets.zsets几种数据类型 1.string数据类型 可包含任何数据,是二进制安全的,比如图片或者序列化的对象set key valueset na ...