本文目录一览:
如何使用PHP调用ArcGIS Server的Soap接口
前一阵子,简单的学习了一下ArcGIS Server,在开发层次上ArcGIS Server支持两种协议,一个是老的Soap协议,也就是webservice,另外一种是REST协议,其中REST协议是从ArcGIS Server9.3开始支持的协议,也是ESRI今后只要支持的协议,但是老的Soap协议还继续支持。该章得内容主要介绍如何使用PHP来调用ArcGIS Server的WebService。
查看ArcGIS Server的SOAP SDK的帮助的时候,会发现所提供的示例代码只有c#,vb.net和java的,并没有PHP语言的示例,实际上并不是不支持PHP语言,从PHP toolkits include PHP-SOAP and NuSOAP上可以看出PHP是支持Soap协议的,只不过使用PHP并没有提供现成的工具可以将WSDL转换成本地化的类,而.NET SDK提供了Wsdl.exe工具,java提供了Apache Axis工具可以将WSDL中的类型转换成本地化类。
当使用PHP调用WebService的时候,当输入的参数是简单数据类型的时候是没有任何问题的,返回值类型是类得时候也没有任何的问题,但是当输入参数的值类型为某个类得时候,就无法调用了,这些类太多了,自己手写这些类几乎是不可能,因此找到一个类似于Wsdl.exe和Apache Axis的工具还是很有必要的,在网上终于搜到一个工具,名字为wsdl2php.php可以实现该功能,其代码如下所示:
// +————————————————————————+
// | wsdl2php |
// +————————————————————————+
// | Copyright (C) 2005 Knut Urdalen |
// +————————————————————————+
// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
// | “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
// | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
// | OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
// | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
// | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
// | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
// | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
// | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
// | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
// +————————————————————————+
// | This software is licensed under the LGPL license. For more information |
// | see |
// +————————————————————————+
ini_set(‘soap.wsdl_cache_enabled’, 0); // disable WSDL cache
//if( $_SERVER[‘argc’] != 2 ) {
// die(“usage: wsdl2php /n”);
//}
$wsdl = “liuf:8399/arcgis/services/catchment/MapServer?wsdl”;
print “Analyzing WSDL”;
try {
$client = new SoapClient($wsdl);
} catch(SoapFault $e) {
die($e);
}
print “.”;
$dom = DOMDocument::load($wsdl);
print “.”;
// get documentation
$nodes = $dom-getElementsByTagName(‘documentation’);
$doc = array(‘service’ = ”,
‘operations’ = array());
foreach($nodes as $node) {
if( $node-parentNode-localName == ‘service’ ) {
$doc[‘service’] = trim($node-parentNode-nodeValue);
} else if( $node-parentNode-localName == ‘operation’ ) {
$operation = $node-parentNode-getAttribute(‘name’);
//$parameterOrder = $node-parentNode-getAttribute(‘parameterOrder’);
$doc[‘operations’][$operation] = trim($node-nodeValue);
}
}
print “.”;
// get targetNamespace
$targetNamespace = ”;
$nodes = $dom-getElementsByTagName(‘definitions’);
foreach($nodes as $node) {
$targetNamespace = $node-getAttribute(‘targetNamespace’);
}
print “.”;
// declare service
$service = array(‘class’ = $dom-getElementsByTagNameNS(‘*’, ‘service’)-item(0)-getAttribute(‘name’),
‘wsdl’ = $wsdl,
‘doc’ = $doc[‘service’],
‘functions’ = array());
print “.”;
// PHP keywords – can not be used as constants, class names or function names!
$reserved_keywords = array(‘and’, ‘or’, ‘xor’, ‘as’, ‘break’, ‘case’, ‘cfunction’, ‘class’, ‘continue’, ‘declare’, ‘const’, ‘default’, ‘do’, ‘else’, ‘elseif’, ‘enddeclare’, ‘endfor’, ‘endforeach’, ‘endif’, ‘endswitch’, ‘endwhile’, ‘eval’, ‘extends’, ‘for’, ‘foreach’, ‘function’, ‘global’, ‘if’, ‘new’, ‘old_function’, ‘static’, ‘switch’, ‘use’, ‘var’, ‘while’, ‘array’, ‘die’, ‘echo’, ’empty’, ‘exit’, ‘include’, ‘include_once’, ‘isset’, ‘list’, ‘print’, ‘require’, ‘require_once’, ‘return’, ‘unset’, ‘__file__’, ‘__line__’, ‘__function__’, ‘__class__’, ‘abstract’, ‘private’, ‘public’, ‘protected’, ‘throw’, ‘try’);
php soap 如何设置超时?
在使用soap前,先检查soap的url是否可访问。如为true则继续执行Soap,否则给出超时提醒。
下面是我经常使用的判断网站链接是否可用的函数,希望对你有用。
//判断URL在指定时间内是否有相应
function checkUrl($url, $timeout = 3){
$ret = false;
$handle = curl_init();
curl_setopt($handle, CURLOPT_URL,$url);
curl_setopt($handle, CURLOPT_NOBODY, true);
curl_setopt($handle, CURLOPT_TIMEOUT,$timeout);//设置默认超时时间为3秒
$result = curl_exec($handle);
$httpCode = curl_getinfo($handle, CURLINFO_HTTP_CODE);
curl_close($handle);
if(strpos($httpCode,’2′) == 0){
$ret = true;
}
return $ret;
}
如何给soap添加header头 php
使用php 设置soapHeader时要如下进行,不然发出去的包会变成类似“itemkeyuser/keyvalue23107720/value/item”的格式: $auth_header = array( ‘user’=$key, ‘password’=$pwd ); // 下面的RequestSOAPHeader 对应 wsdl 定义里面的 xsd:element name=”RequestSOAPHeader”….. $authvalues = new SoapVar($auth_header, SOAP_ENC_OBJECT,”RequestSOAPHeader”,$uri); $header = new SoapHeader($uri, ‘RequestSOAPHeader’, $authvalues); $api = new SoapClient(null,$options); $api-__setSoapHeaders(array($header));不明白的话可以去后盾人看看相关的教学视频。
请大神指教用php发送SOAP请求
使用PHP中的soap类进行soap请求,请求的数据要跟wsdl中的数据类型一致,返回的数据也是由WSDL中定义好了的按照定义去取数据即可。
原创文章,作者:AJYX,如若转载,请注明出处:https://www.506064.com/n/144187.html