千家信息网

php调用webservice失败怎么解决

发表于:2024-10-10 作者:千家信息网编辑
千家信息网最后更新 2024年10月10日,这篇"php调用webservice失败怎么解决"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来
千家信息网最后更新 2024年10月10日php调用webservice失败怎么解决

这篇"php调用webservice失败怎么解决"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇"php调用webservice失败怎么解决"文章吧。

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 = '';                $bindingWSDL = '\n\n";                $serviceWSDL = '\n\nservice_name.'Port" binding="tns:'.$this->service_name."Binding\">\n\n\n";                $messageWSDL = '';                foreach ($methods as $method) {                        if ($method->isPublic() && !$method->isConstructor()) {                                $portTypeWSDL.= '\n".'\ngetName()."Response\" />\n\n";                                $bindingWSDL.= '\n".'\nservice_name\" encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\" />\n\n\nservice_name\" encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\" />\n\n\n";                            $messageWSDL.= '\n";                                $parameters = $method->getParameters();                                foreach ($parameters as $parameter) {                                        $messageWSDL.= '\n";                                }                                $messageWSDL.= "\n";                                $messageWSDL.= '\n";                                $messageWSDL.= '\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失败怎么解决"这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注行业资讯频道。

0