Новости | FAQ | Авторы | Документация | В действии | Библиотека |
Инструменты | Полезные ссылки | Хостинги | Скачать | Примеры | Форум |
virusav 18.03.2016 20:33
Выкладываю код, т.к. не вижу, как тут файл прикрепить.)######################################## @CLASS SOAP ######################################## @SET_address[sValue] $sAddress[$sValue] ######################################## @GET_address[] $result[$sAddress] ######################################## @SET_user[sValue] $sUser[$sValue] ######################################## @GET_user[] $result[$sUser] ######################################## @SET_password[sValue] $sPassword[$sValue] ######################################## @GET_password[] $result[$sPassword] ######################################## @SET_charset[sValue] $sCharset[$sValue] ######################################## @GET_charset[] $result[$sCharset] ######################################## @create[hInput] $self.user[$hInput.sUser] $self.password[$hInput.sPassword] $self.charset[^if(def $hInput.sCharset){$hInput.sCharset}{UTF-8}] ######################################## @loadURL[hInput][key;value] $result[^curl:load[ $.mode[text] $.timeout(60) $.charset[$self.charset] $.url[^taint[as-is][$hInput.sURL]] $.userpwd[${self.user}:$self.password] ^if(def $hInput.hData){ ^if(^hInput.hData.contains[postfields]){ $.post(true) } ^hInput.hData.foreach[key;value]{ $.[$key][$value] } } $.ssl_verifypeer[] ]] ######################################## @sendRequest[hInput][fFile] $fFile[^self.loadURL[ $.sURL[$self.address] $.hData[ $.postfields[^taint[as-is][^if(def $hInput.sRequest){$hInput.sRequest}{^self.getRequest[$hInput.hWSDL;$hInput.sOperation;$hInput.hRequest]}]] ] ]] $result[^self.getResponse[$hInput.hWSDL;$fFile.text]] ######################################## @parseWSDL[sWSDL;bLoad;bLocal][fFile;xdData;hWSDL;key;value;sNodeName;key1;value1;key2;value2;sNodeName1;key3;value3] $bLoad($bLoad eq "1") $bLocal($bLocal eq "1") ^if($bLoad){ ^if(!$bLocal){ $fFile[^self.loadURL[ $.sURL[$sWSDL] $.hData[ $.postfields[] ] ]] $xdData[^xdoc::create{^taint[as-is][$fFile.text]}] }{ $xdData[^xdoc::load[$sWSDL]] } }{ $xdData[^xdoc::create{^taint[as-is][$sWSDL]}] } $hWSDL[ $.definitions[^hash::create[]] $.service[^hash::create[]] $.binding[^hash::create[]] $.porttype[^hash::create[]] $.message[^hash::create[]] $.types[^hash::create[]] ] ^if(^xdData.hasChildNodes[] && ^xdData.childNodes.0.nodeName.lower[] eq "definitions" && ^xdData.childNodes.0.hasChildNodes[]){ $hWSDL.definitions.ns[^self.getNS[$xdData.childNodes.0]] ^xdData.childNodes.0.attributes.foreach[key;value]{ $hWSDL.definitions.[$key][$value.nodeValue] } ^xdData.childNodes.0.childNodes.foreach[;value]{ ^if($value.nodeType==1 && ^value.hasChildNodes[]){ $sNodeName[^value.nodeName.lower[]] ^switch[$sNodeName]{ ^case[types]{ ^value.childNodes.foreach[;value1]{ ^if($value1.nodeType==1 && ^value1.nodeName.lower[] eq "schema" && ^value1.hasChildNodes[]){ $hWSDL.types.[$value1.attributes.targetNamespace.nodeValue][ $.ns[^self.getNS[$value1]] $.prefix[$value1.prefix] $.type[^hash::create[]] $.element[^hash::create[]] ] ^value1.childNodes.foreach[;value2]{ ^if($value2.nodeType==1 && ^value2.hasChildNodes[]){ $sNodeName1[^value2.nodeName.lower[]] ^switch[$sNodeName1]{ ^case[complextype]{ $hWSDL.types.[$value1.attributes.targetNamespace.nodeValue].type.[$value2.attributes.name.nodeValue][ $.prefix[$value2.prefix] $.field[^self.getComplexType[$value2]] ] } ^case[element]{ ^value2.childNodes.foreach[;value3]{ ^if($value3.nodeType==1 && ^value3.nodeName.lower[] eq "complextype" && ^value3.hasChildNodes[]){ $hWSDL.types.[$value1.attributes.targetNamespace.nodeValue].element.[$value2.attributes.name.nodeValue][ $.prefix[$value3.prefix] $.field[^self.getComplexType[$value3]] ] } } } } } } } } } ^case[message]{ $hWSDL.message.[$value.attributes.name.nodeValue][^hash::create[]] ^value.childNodes.foreach[;value1]{ ^if($value1.nodeType==1 && ^value1.nodeName.lower[] eq "part"){ $hWSDL.message.[$value.attributes.name.nodeValue].[$value1.attributes.name.nodeValue][ $.element[$value1.attributes.element.nodeValue] $.type[$value1.attributes.type.nodeValue] $.data_type[^if(def $value1.attributes.element.nodeValue){element}{type}] $.part[1] ] } } } ^case[porttype]{ $hWSDL.porttype.[$value.attributes.name.nodeValue][^hash::create[]] ^value.childNodes.foreach[;value1]{ ^if($value1.nodeType==1 && ^value1.nodeName.lower[] eq "operation" && ^value1.hasChildNodes[]){ $hWSDL.porttype.[$value.attributes.name.nodeValue].[$value1.attributes.name.nodeValue][^hash::create[]] ^value1.childNodes.foreach[;value2]{ ^if($value2.nodeType==1){ $hWSDL.porttype.[$value.attributes.name.nodeValue].[$value1.attributes.name.nodeValue].[$value2.nodeName][$value2.attributes.message.nodeValue] } } } } } ^case[binding]{ $hWSDL.binding.[$value.attributes.name.nodeValue][ $.porttype[$value.attributes.type.nodeValue] $.operation[^hash::create[]] ] ^value.childNodes.foreach[;value1]{ ^if($value1.nodeType==1 && ^value1.nodeName.lower[] eq "operation" && ^value1.hasChildNodes[]){ ^value1.childNodes.foreach[;value2]{ ^if($value2.nodeType==1 && ^value2.nodeName.lower[] eq "operation"){ $hWSDL.binding.[$value.attributes.name.nodeValue].operation.[$value1.attributes.name.nodeValue][$value2.attributes.soapAction.nodeValue] } } } } } ^case[service]{ $hWSDL.service.name[$value.attributes.name.nodeValue] $hWSDL.service.port[^hash::create[]] ^value.childNodes.foreach[;value1]{ ^if($value1.nodeType==1 && ^value1.nodeName.lower[] eq "port"){ $hWSDL.service.port.[$value1.attributes.name.nodeValue][ $.binding[$value1.attributes.binding.nodeValue] ] ^value1.childNodes.foreach[;value2]{ ^if(^value2.nodeName.lower[] eq "address"){ $hWSDL.service.port.[$value1.attributes.name.nodeValue].prefix[$value2.prefix] $hWSDL.service.port.[$value1.attributes.name.nodeValue].address[$value2.attributes.location.nodeValue] ^if(^hWSDL.service.port._count[]==1){ $self.address[^taint[as-is][$value2.attributes.location.nodeValue]] } } } } } } } } } } $result[$hWSDL] ######################################## @getNS[xnData;sPrefix;sNodeName][hData;xdTemp;xnTemp;sTemp;tTemp] $hData[^hash::create[]] $xdTemp[^xdoc::create[uuid]] $xnTemp[^xdTemp.documentElement.appendChild[$xnData]] $sTemp[^xdTemp.string[]] $sTemp[^sTemp.match[<^if(def $xnData.prefix){${xnData.prefix}:}${xnData.nodeName}([^^>]+?)>][i]{ $tTemp[^match.1.match[xmlns:([^^=]+?)="([^^"]+?)"][gi]] ^tTemp.sort{$tTemp.2}[asc] ^tTemp.menu{ ^if($tTemp.1 ne "xs"){ $hData.[$tTemp.1][$tTemp.2] } } }] $result[$hData] ######################################## @getComplexType[xdData][key;value;hData;key1;value1;key2;value2] ^xdData.childNodes.foreach[;value]{ ^if($value.nodeType==1 && ^value.hasChildNodes[]){ $hData[^hash::create[]] ^value.childNodes.foreach[;value1]{ ^if($value1.nodeType==1 && ^value1.nodeName.lower[] eq "element"){ $hData.[$value1.attributes.name.nodeValue][ $.prefix[$value1.prefix] ^value1.attributes.foreach[key2;value2]{ ^if($key2 ne "name"){ $.[$key2][$value2.nodeValue] } } ] } } } } $result[$hData] ######################################## @getOperationType[sAction;sActionSide] $result[^switch[$sAction]{ ^case[request]{^switch[$sActionSide]{ ^case[server]{output} ^case[DEFAULT]{input} }} ^case[response]{^switch[$sActionSide]{ ^case[server]{input} ^case[DEFAULT]{output} }} }] ######################################## @getRequest[hWSDL;sOperation;hRequest;sActionSide][hNS;iNum;sHTML;sOperationType;key;value;tTemp;key1;value1;tField;key2;value2] $hNS[^hash::create[]] $iNum(0) $sHTML[<?xml version="1.0" encoding="$self.charset"?><SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"^hWSDL.definitions.ns.foreach[key;value]{ xmlns:^iNum.inc[]$hNS.[$value][ns$iNum]ns$iNum="$value"}><SOAP-ENV:Body>] $sOperationType[^getOperationType[request;$sActionSide]] ^hWSDL.porttype.foreach[key;value]{ ^if(^value.contains[$sOperation]){ $tTemp[^value.[$sOperation].[$sOperationType].split[:;h]] ^if(^hWSDL.message.contains[$tTemp.1]){ $sHTML[$sHTML<$hNS.[$hWSDL.definitions.ns.[$tTemp.0]]:$sOperation>] ^hWSDL.message.[$tTemp.1].foreach[key1;value1]{ $tField[^value1.[$value1.data_type].split[:;h]] ^if(^hWSDL.types.contains[$hWSDL.definitions.ns.[$tTemp.0]] && ^hWSDL.types.[$hWSDL.definitions.ns.[$tTemp.0]].contains[$value1.data_type] && ^hWSDL.types.[$hWSDL.definitions.ns.[$tTemp.0]].[$value1.data_type].contains[$tField.1]){ ^if($value1.data_type eq "type"){ $sHTML[$sHTML<$key1>] } ^hWSDL.types.[$hWSDL.definitions.ns.[$tTemp.0]].[$value1.data_type].[$tField.1].field.foreach[key2;value2]{ $sHTML[^self.getRequestFieldValue[$sHTML;$hWSDL;^if(!^value2.contains[minOccurs]){$hRequest}{$hRequest.[$key2]};$hNS;$hWSDL.definitions.ns.[$tTemp.0];$hWSDL.types.[$hWSDL.definitions.ns.[$tTemp.0]].ns;$key2;$value2]] } ^if($value1.data_type eq "type"){ $sHTML[$sHTML</$key1>] } }{ $sHTML[^self.getRequestFieldValue[$sHTML;$hWSDL;$hRequest;$hNS;$hWSDL.definitions.ns.[$tTemp.0];;$key1;$value1]] } } $sHTML[$sHTML</$hNS.[$hWSDL.definitions.ns.[$tTemp.0]]:$sOperation>] ^break[] } ^break[] } } $result[$sHTML</SOAP-ENV:Body></SOAP-ENV:Envelope>] ######################################## @getRequestFieldValue[sHTML;hWSDL;hRequest;hNS;sFieldNS;hFieldNS;sField;hField][tField;sNS;key;value;key1;value1;sTemp] $tField[^hField.type.split[:;h]] $sNS[$hFieldNS.[$tField.0]] ^if(^hWSDL.types.contains[$sNS] && ^hWSDL.types.[$sNS].contains[type] && ^hWSDL.types.[$sNS].type.contains[$tField.1]){ ^if(!^hField.contains[minOccurs]){ $hRequest[ $.1[$hRequest.[$sField]] ] } ^if(def $hRequest){ ^hRequest.foreach[;value]{ $sHTML[$sHTML<$hNS.[$sFieldNS]:$sField>] ^hWSDL.types.[$sNS].type.[$tField.1].field.foreach[key1;value1]{ $sHTML[^self.getRequestFieldValue[$sHTML;$hWSDL;$value;$hNS;$sNS;$hWSDL.types.[$sNS].ns;$key1;$value1]] } $sHTML[$sHTML</$hNS.[$sFieldNS]:$sField>] } } }{ ^if(!($hRequest.[$sField] is hash)){ $hRequest.[$sField][ $.1[$hRequest.[$sField]] ] } $sTemp[^if(!^hField.contains[part]){$hNS.[$sFieldNS]:}] $sHTML[${sHTML}^hRequest.[$sField].foreach[;value]{^if(def $value){<${sTemp}$sField>^switch[$tField.1]{ ^case[boolean]{^if($value){true}{false}} ^case[date]{^formatDate[$value;1;0]} ^case[dateTime]{^formatDate[$value;1]} ^case[decimal]{^value.format[%.2f]} ^case[integer;int]{^value.int(0)} ^case[string]{$value} }</${sTemp}$sField>}(!^hField.contains[minOccurs]){<${sTemp}$sField xsi:nil="true"/>}}] } $result[$sHTML] ######################################## @getResponse[hWSDL;sHTML;sActionSide][hTemp;fFile;key;value;sTemp;xdData;sOperationType;hData;xnData;hNS;sOperation;sType;tTemp;key1;value1;tField;key2;value2] $hTemp[^hash::create[]] $fFile[^file::create[text;temp.txt;$sHTML; $.charset[$self.charset] ]] $sHTML[^fFile.text.match[<\s*\?\s*xml(?:(?!\s*\?\s*>).+?)\s*\?\s*>][i]{}] ^hWSDL.definitions.ns.foreach[key;value]{ $sTemp[^sHTML.match[^^\s*<([^^>]+?)>][]{ ^if(^match.1.pos[xmlns:$key=]==-1){ $hTemp.[$value][$key] $sHTML[^sHTML.match[\s*<([^^>]+?)>][]{<$match.1 xmlns:$key="$value">}] } }] } $sHTML[^sHTML.match[ xmlns="([^^"]+?)"][gi]{ xmlns="$hTemp.[$match.1]:$match.1"}] $xdData[^xdoc::create{<?xml version="1.0" encoding="$self.charset"?>^taint[as-is][$sHTML]}] $sOperationType[^getOperationType[response;$sActionSide]] $hData[^hash::create[]] ^xdData.childNodes.0.childNodes.foreach[;value]{ ^if($value.nodeType==1 && ^value.hasChildNodes[] && $value.nodeName eq "Body"){ $xnData[$value] $hTemp[^xnData.getElementsByTagName[Fault]] ^if(def $hTemp && $hTemp.0.nodeType==1 && ^hTemp.0.hasChildNodes[]){ $hData._ERROR[^hash::create[]] ^hTemp.0.childNodes.foreach[;value1]{ ^if($value1.nodeType==1){ $hData._ERROR.[$value1.nodeName][$value1.childNodes.0.nodeValue] } } }{ $hNS[^self.getNS[$xdData.childNodes.0]] ^xnData.childNodes.foreach[;value]{ ^if($value.nodeType==1){ ^hNS.add[^self.getNS[$value]] $sOperation[^value.nodeName.match[Response^$][im]{}] $sType[$hNS.[$value.prefix]] ^hWSDL.porttype.foreach[key;value]{ ^if(^value.contains[$sOperation]){ $tTemp[^value.[$sOperation].[$sOperationType].split[:;h]] ^if(^hWSDL.message.contains[$tTemp.1]){ ^hWSDL.message.[$tTemp.1].foreach[key1;value1]{ $tField[^value1.[$value1.data_type].split[:;h]] ^if(^hWSDL.types.contains[$sType] && ^hWSDL.types.[$sType].contains[$value1.data_type] && ^hWSDL.types.[$sType].[$value1.data_type].contains[$tField.1]){ ^hWSDL.types.[$sType].[$value1.data_type].[$tField.1].field.foreach[key2;value2]{ ^self.getResponseFieldValue[$hData;$hWSDL;^xnData.getElementsByTagName[$key2];$hWSDL.types.[$sType].ns;$key2;$value2] } }{ ^self.getResponseFieldValue[$hData;$hWSDL;^xnData.getElementsByTagName[$key1];$hWSDL.types.[$sType].ns;$key1;$value1] } } ^break[] } } } } } } } } $result[$hData] ######################################## @getResponseFieldValue[hData;hWSDL;hResponse;hFieldNS;sField;hField][tField;sNS;key;value;key1;value1;hTemp;iTemp;iNum;Temp;hKey;hValue] $tField[^hField.type.split[:;h]] $sNS[$hFieldNS.[$tField.0]] ^if(^hWSDL.types.contains[$sNS] && ^hWSDL.types.[$sNS].contains[type] && ^hWSDL.types.[$sNS].type.contains[$tField.1]){ $hData.[$sField][^hash::create[]] ^hResponse.foreach[key;value]{ ^hWSDL.types.[$sNS].type.[$tField.1].field.foreach[key1;value1]{ ^if(^hField.contains[minOccurs]){ ^if(!def $hData.[$sField].[$key]){ $hData.[$sField].[$key][^hash::create[]] } $hTemp[$hData.[$sField].[$key]] }{ $hTemp[$hData.[$sField]] } ^self.getResponseFieldValue[$hTemp;$hWSDL;^value.getElementsByTagName[$key1];$hWSDL.types.[$sNS].ns;$key1;$value1] } } }{ $iTemp(^hResponse._count[]) $iNum(0) ^hResponse.foreach[;value]{ ^if(def $value.childNodes.0.nodeValue || $value.childNodes.0.nodeType==1){ ^switch[$tField.1]{ ^case[boolean]{ $Temp($value.childNodes.0.nodeValue eq "true") } ^case[date]{ $Temp[^formatDate[$value.childNodes.0.nodeValue;1;0]] } ^case[dateTime]{ $Temp[^formatDate[$value.childNodes.0.nodeValue;1]] } ^case[decimal]{ $Temp(^value.childNodes.0.nodeValue.format[%.2f]) } ^case[integer;int]{ $Temp(^value.childNodes.0.nodeValue.int(0)) } ^case[string]{ $Temp[$value.childNodes.0.nodeValue] } ^case[Array]{ $Temp[^hash::create[]] ^if(^value.childNodes.0.hasChildNodes[]){ ^value.childNodes.0.childNodes.foreach[;value1]{ ^if(^value1.hasChildNodes[]){ $hKey[^value1.getElementsByTagName[key]] $hValue[^value1.getElementsByTagName[value]] $Temp.[$hKey.0.childNodes.0.nodeValue][$hValue.0.childNodes.0.nodeValue] } } } } } ^if(!^hField.contains[minOccurs]){ ^if($Temp is bool || $Temp is int || $Temp is double){ $hData.[$sField]($Temp) }{ $hData.[$sField][$Temp] } }{ ^iNum.inc[] ^if($iNum==1){ $hData.[$sField][^hash::create[]] } ^if($Temp is bool || $Temp is int || $Temp is double){ $hData.[$sField].[$iNum]($Temp) }{ $hData.[$sField].[$iNum][$Temp] } } } } } $result[]Использование:
^use[soap.p] # user и password использовались для базовой авторизации $oSOAP[^SOAP::create[ $.sUser[user] $.sPassword[password] $.sCharset[UTF-8] ]] # есть возможность парсить WSDL на локальном диске или на удаленном ресурсе по ссылке $hWSDL[^oSOAP.parseWSDL[wsdl.xml;1;1]] # указываем название функции, которую надо вызвать, и "сторону" (клиент или сервер) # hRequest - структура с данными (хеш), которые надо передать серверу $sHTML[^oSOAP.getRequest[$hWSDL;название функции;$hRequest;client]] # посылаем серверу сформированный запрос и получаем ответ в виде хеша $hData[^oSOAP.sendRequest[ $.hWSDL[$hWSDL] $.sOperation[название функции] $.sRequest[$sHTML] ]]Сервер:
^use[soap.p] # user и password использовались для базовой авторизации $oSOAP[^SOAP::create[ $.sUser[user] $.sPassword[password] $.sCharset[UTF-8] ]] # есть возможность парсить WSDL на локальном диске или на удаленном ресурсе по ссылке $hWSDL[^oSOAP.parseWSDL[wsdl.xml;1;1]] # принимаем от клиента запрос и получаем хеш с данными для обработки $hData[^oSOAP.getResponse[$hWSDL;^taint[as-is][$request:body];server]] # формируем хеш для ответа $hRequest[ $...[...] ] # возвращаем результат клиенту в "понятном" ему виде $result[^oSOAP.getRequest[$hWSDL;название функции;$hRequest;server]]