日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
php調(diào)用webservice失敗怎么辦

本文操作環(huán)境:windows7系統(tǒng)、php7.1版、DELL G3電腦

成都創(chuàng)新互聯(lián)公司-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比康保網(wǎng)站開(kāi)發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式康保網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋康保地區(qū)。費(fèi)用合理售后完善,十余年實(shí)體公司更值得信賴。

php調(diào)用webservice失敗怎么辦?

php編寫webservice案例、webservice調(diào)用失敗

作為開(kāi)發(fā)者來(lái)講,要想寫webservice接口或者調(diào)用別人的webservice接口,首先需要了解什么是webservice。

簡(jiǎn)單說(shuō), WebService就是一些站點(diǎn)開(kāi)放一些服務(wù)出來(lái), 也可以是你自己開(kāi)發(fā)的Service, 也就是一些方法, 通過(guò)URL,指定某一個(gè)方法名,發(fā)出請(qǐng)求,站點(diǎn)里的這個(gè)服務(wù)(方法),接到你的請(qǐng)求,根據(jù)傳過(guò)來(lái)的參數(shù),做一些處理,然后把處理后的結(jié)果以XML形式返回來(lái)給你,你的程序就解析這些XML數(shù)據(jù),然后顯示出來(lái)或做其它操作。

在開(kāi)始編寫之前需要對(duì)php環(huán)境做一些配置:

打開(kāi)php安裝目錄下的php.ini文件

找到 ;extension=php_soap.dll ,去掉前面的分號(hào),保存,然后重啟apache。

配置好環(huán)境就可以編寫php了,先創(chuàng)建creatService.php文件,復(fù)制下面代碼:

query("insert into test_soap (text) values('".$text."')");
        
		if($result){
			return $result;
		}else{
			return "插入失敗";
		}
    }
}

if(file_exists('ServiceTest.wsdl')){ //只有當(dāng)ServiceTest.wsdl文件存在時(shí)才進(jìn)行注冊(cè)類
    $objSoapServer = new SoapServer("ServiceTest.wsdl");
    //注冊(cè)ServiceTest類的所有方法 
    $objSoapServer->setClass("ServiceTest");
    //處理請(qǐng)求 
    $objSoapServer->handle();
}

require_once "SoapDiscovery.class.php";
$dis=new SoapDiscovery("ServiceTest","WebService"); //第一個(gè)參數(shù)為類名也是生成wsdl的文件名
$dis->getWSDL();



?>

第一次運(yùn)行creatService.php文件時(shí)要?jiǎng)?chuàng)建wsdl文件,創(chuàng)建WSDL文件需要用到一個(gè)輔助類SoapDiscovery.class.php。在文章末尾可以得到。

創(chuàng)建完成之后便是測(cè)試調(diào)用,創(chuàng)建client.php文件,復(fù)制以下代碼:

ini_set('soap.wsdl_cache_enabled','0');//關(guān)閉緩存

$x = new SoapClient("http://localhost/webServiceTest/ServiceTest.wsdl"); //這里的鏈接換成你自己的訪問(wèn)鏈接

try {
    echo $x->firstHandle('qweqrwergwe');

    echo ('
');
    var_dump ( $x->__getFunctions () );//獲取服務(wù)器上提供的方法
    echo ('
'); echo ('
');
    var_dump ( $x->__getTypes () );//獲取服務(wù)器上數(shù)據(jù)類型
    echo ('
'); }catch (SoapFault $f){ echo "Error Message: {$f->getMessage()}"; }

注意! ini_set('soap.wsdl_cache_enabled','0'); //關(guān)閉WSDL緩存

如果不關(guān)閉緩存,會(huì)造成測(cè)試無(wú)效,緩存數(shù)據(jù)會(huì)擾亂測(cè)試準(zhǔn)確性。

注意!如果是在thinkphp5中使用SoapClient函數(shù)應(yīng)當(dāng)如下使用:

$client = new \SoapClient ('http://www.baidu.com/ids/terminal/terminalWs.wsdl');

重要點(diǎn):

使用https訪問(wèn)webservice的話會(huì)出現(xiàn)訪問(wèn)異常,博主就遇到這個(gè)問(wèn)題的,本地創(chuàng)建和調(diào)用webservice都通過(guò)了,但是一放到線上就無(wú)法調(diào)用了,然后各種google、baidu。最后才發(fā)現(xiàn)線上的環(huán)境是http強(qiáng)制轉(zhuǎn)了https。

我的解決辦法是取消了http強(qiáng)制轉(zhuǎn)換https的功能:

找到httpd-vhost.conf,注釋掉一下代碼:

##    RewriteEngine on
##    RewriteCond   %{HTTPS} !=on
##    RewriteRule   ^(.*)  https://%{SERVER_NAME}$1 [L,R]

注釋掉上面的代碼后我發(fā)現(xiàn)我的網(wǎng)站不是https了,嗚嗚嗚~,真的是拆了東墻補(bǔ)西墻啊,趕緊想辦法,因?yàn)榫W(wǎng)站必須使用https才行,還好我使用的是thinkphp框架,找到了一個(gè)方法,在入口文件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";
	}
}
 
?>

網(wǎng)站欄目:php調(diào)用webservice失敗怎么辦
文章網(wǎng)址:http://m.5511xx.com/article/ccdesgs.html