这篇“php调用webservice失败怎么解决”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“php调用webservice失败怎么解决”文章吧。
目前累计服务客户上千家,积累了丰富的产品开发及服务经验。以网站设计水平和技术实力,树立企业形象,为客户提供网站建设、成都网站建设、网站策划、网页设计、网络营销、VI设计、网站改版、漏洞修补等服务。成都创新互联始终以务实、诚信为根本,不断创新和提高建站品质,通过对领先技术的掌握、对创意设计的研究、对客户形象的视觉传递、对应用系统的结合,为客户提供更好的一站式互联网解决方案,携手广大客户,共同发展进步。
php调用webservice失败的解决办法:1、去掉“;extension=php_soap.dll”前的分号并重启apache;2、创建WSDL文件并运行creatService.php文件;3、关闭WSDL缓存。

本文操作环境:windows7系统、PHP7.1版、DELL G3电脑
php调用webservice失败怎么办?
php编写webservice案例、webservice调用失败
作为开发者来讲,要想写webservice接口或者调用别人的webservice接口,首先需要了解什么是webservice。
简单说, WebService就是一些站点开放一些服务出来, 也可以是你自己开发的Service, 也就是一些方法, 通过URL,指定某一个方法名,发出请求,站点里的这个服务(方法),接到你的请求,根据传过来的参数,做一些处理,然后把处理后的结果以XML形式返回来给你,你的程序就解析这些XML数据,然后显示出来或做其它操作。
在开始编写之前需要对php环境做一些配置:
打开php安装目录下的php.ini文件
找到 ;extension=php_soap.dll ,去掉前面的分号,保存,然后重启apache。
配置好环境就可以编写php了,先创建creatService.php文件,复制下面代码:
query("insert into test_soap (text) values('".$text."')");
if($result){
return $result;
}else{
return "插入失败";
}
}
}
if(file_exists('ServiceTest.wsdl')){ //只有当ServiceTest.wsdl文件存在时才进行注册类
$objSoapServer = new SoapServer("ServiceTest.wsdl");
//注册ServiceTest类的所有方法
$objSoapServer->setClass("ServiceTest");
//处理请求
$objSoapServer->handle();
}
require_once "SoapDiscovery.class.php";
$dis=new SoapDiscovery("ServiceTest","WebService"); //第一个参数为类名也是生成wsdl的文件名
$dis->getWSDL();
?>第一次运行creatService.php文件时要创建wsdl文件,创建WSDL文件需要用到一个辅助类SoapDiscovery.class.php。在文章末尾可以得到。
创建完成之后便是测试调用,创建client.php文件,复制以下代码:
ini_set('soap.wsdl_cache_enabled','0');//关闭缓存
$x = new SoapClient("http://localhost/webServiceTest/ServiceTest.wsdl"); //这里的链接换成你自己的访问链接
try {
echo $x->firstHandle('qweqrwergwe');
echo ('');
var_dump ( $x->__getFunctions () );//获取服务器上提供的方法
echo ('
');
echo ('');
var_dump ( $x->__getTypes () );//获取服务器上数据类型
echo ('');
}catch (SoapFault $f){
echo "Error Message: {$f->getMessage()}";
}注意! ini_set('soap.wsdl_cache_enabled','0'); //关闭WSDL缓存
如果不关闭缓存,会造成测试无效,缓存数据会扰乱测试准确性。
注意!如果是在thinkphp5中使用SoapClient函数应当如下使用:
$client = new \SoapClient ('http://www.baidu.com/ids/terminal/terminalWs.wsdl');重要点:
使用https访问webservice的话会出现访问异常,博主就遇到这个问题的,本地创建和调用webservice都通过了,但是一放到线上就无法调用了,然后各种google、baidu。最后才发现线上的环境是http强制转了https。
我的解决办法是取消了http强制转换https的功能:
找到httpd-vhost.conf,注释掉一下代码:
## RewriteEngine on
## RewriteCond %{HTTPS} !=on
## RewriteRule ^(.*) https://%{SERVER_NAME}$1 [L,R]注释掉上面的代码后我发现我的网站不是https了,呜呜呜~,真的是拆了东墙补西墙啊,赶紧想办法,因为网站必须使用https才行,还好我使用的是thinkphp框架,找到了一个方法,在入口文件index.php最下面加入下面的代码就行了:
if (empty($_SERVER['HTTPS']) || $_SERVER['HTTPS'] === "off") {
$location = 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
header('HTTP/1.1 301 Moved Permanently');
header('Location: ' . $location);
exit;
}SoapDiscovery.class.php类:
class_name = $class_name;
$this->service_name = $service_name;
}
/**
* SoapDiscovery::getWSDL() Returns the WSDL of a class if the class is instantiable.
*
* @return string
**/
public function getWSDL() {
if (empty($this->service_name)) {
throw new Exception('No service name.');
}
$headerWSDL = "\n";
$headerWSDL.= "service_name\" targetNamespace=\"urn:$this->service_name\" xmlns:wsdl=\"http://schemas.xmlsoap.org/wsdl/\" xmlns:soap=\"http://schemas.xmlsoap.org/wsdl/soap/\" xmlns:tns=\"urn:$this->service_name\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:SOAP-ENC=\"http://schemas.xmlsoap.org/soap/encoding/\" xmlns=\"http://schemas.xmlsoap.org/wsdl/\">\n";
$headerWSDL.= " \n";
if (empty($this->class_name)) {
throw new Exception('No class name.');
}
$class = new ReflectionClass($this->class_name);
if (!$class->isInstantiable()) {
throw new Exception('Class is not instantiable.');
}
$methods = $class->getMethods();
$portTypeWSDL = 'service_name.'Port">';
$bindingWSDL = 'service_name.'Binding" type="tns:'.$this->service_name."Port\">\n \n";
$serviceWSDL = 'service_name."\">\n \nservice_name.'Port" binding="tns:'.$this->service_name."Binding\"> \n \n \n";
$messageWSDL = '';
foreach ($methods as $method) {
if ($method->isPublic() && !$method->isConstructor()) {
$portTypeWSDL.= 'getName()."\">\n".'getName()."Request\" />\n \n";
$bindingWSDL.= 'getName()."\">\n".'service_name.'#'.$this->class_name.'#'.$method->getName()."\" />\nservice_name\" encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\" />\n\n\n \n";
$messageWSDL.= 'getName()."Request\">\n";
$parameters = $method->getParameters();
foreach ($parameters as $parameter) {
$messageWSDL.= 'getName()."\" type=\"xsd:string\" />\n";
}
$messageWSDL.= " \n";
$messageWSDL.= 'getName()."Response\">\n";
$messageWSDL.= 'getName()."\" type=\"xsd:string\" />\n";
$messageWSDL.= " \n";
}
}
$portTypeWSDL.= " \n";
$bindingWSDL.= "\n";
//return sprintf('%s%s%s%s%s%s', $headerWSDL, $portTypeWSDL, $bindingWSDL, $serviceWSDL, $messageWSDL, ' ');
$fso = fopen($this->class_name . ".wsdl" , "w");
fwrite($fso, sprintf('%s%s%s%s%s%s', $headerWSDL, $portTypeWSDL, $bindingWSDL, $serviceWSDL, $messageWSDL, ''));
exit;
}
/**
* SoapDiscovery::getDiscovery() Returns discovery of WSDL.
*
* @return string
**/
public function getDiscovery() {
return "\n\n \n ";
}
}
?>以上就是关于“php调用webservice失败怎么解决”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注创新互联行业资讯频道。