soap 相关问题

简单对象访问协议(SOAP)是用于在Web服务的实现中交换结构化信息的协议规范。

Apache 访问日志中的此错误是什么:“POST /ussd HTTP/1.1”406 344“-”“bf-am-http”?

我正在尝试构建 USSD,操作员正在向我发送 SOAP 请求,但 Apahce 访问日志显示此错误: OperatorIP - - [时间戳] "POST /ussd HTTP/1.1" 406 344 "-&qu...

回答 1 投票 0

如何使用 wsimport 从 WSDL 文件中仅获取源文件

当我尝试使用 wsimport http://www.webservicex.net/geoipservice.asmx?WSDL 时,该命令仅生成 .class 文件。 当我尝试使用 wsimport -keep -s 目录 http://www.webservicex.net/

回答 2 投票 0

我可以使用什么工具来合并wsdl和xsd文件?

我有两个文件,一个是Web服务描述(wsdl),第二个是Web服务中使用的数据结构(xsd)。我什么都没有了,网络服务还不能工作。我需要将它们合并为一个,因为...

回答 3 投票 0

IRestResponse读取List数据

这是我第一次使用 SOAP 工作.. 我使用了一个 Rest 请求,并收到了如下所示的 SOAP: 这是我第一次使用 SOAP.. 我使用了一个 Rest 请求,并收到了这样的 SOAP: <SOAP-ENV:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:c1x="http://www.xxxxxxxxx.Request.com" xmlns:chan="http://www.ibm.com/xmlns/prod/CICS/channel-instance" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> <SOAP-ENV:Body> <C1XAR080OOperationResponse xmlns="http://www.XXXXXXXXX.Response.com" xmlns:cics="http://www.ibm.com/xmlns/prod/CICS/channel-instance" cics:channel="true"> <DHMESSAG xmlns:cics="http://www.ibm.com/xmlns/prod/CICS/channel-instance" cics:structuredContainer="true"> <Context> <AreaInput> <ChiaveMessaggio> <codiceMessaggio>XXXXXXX</codiceMessaggio> <canale>V</canale> <versione>01</versione> </ChiaveMessaggio> <tipoOperazione>S</tipoOperazione> </AreaInput> <AreaOutput> <esito>C</esito> <tipoErrore> </tipoErrore> <tipoRisposta>C</tipoRisposta> <transidHost>XX</transidHost> <transazioneController>&amp;SY&amp;</transazioneController> <cicsDiEsecuzione>XX</cicsDiEsecuzione> <timeOutHost>60</timeOutHost> <idHost>XX</idHost> <messaggioErrore> </messaggioErrore> <codErrore> </codErrore> <AreaAbend> <abendPGM>XX</abendPGM> <abendStepPgm>X</abendStepPgm> <abendStepId>XX</abendStepId> <abendCode> </abendCode> </AreaAbend> <taskNumero>XXXXX</taskNumero> <invPgm>XXXX </invPgm> </AreaOutput> <contatoreRiesecuzioni>0</contatoreRiesecuzioni> <delayStartTransid> </delayStartTransid> <lungMessaggioApplicativo>0</lungMessaggioApplicativo> <AreaContainer> <channelCICS>XXXXXX</channelCICS> <numeroElementiTabella>04</numeroElementiTabella> <TabellaContainer> <RigaContainer> <nomeContainer>XXXXXX</nomeContainer> <tipoContainer>X</tipoContainer> </RigaContainer> <RigaContainer> <nomeContainer>XXXXXXX</nomeContainer> <tipoContainer>I</tipoContainer> </RigaContainer> <RigaContainer> <nomeContainer>XXXXXXX</nomeContainer> <tipoContainer>O</tipoContainer> </RigaContainer> <RigaContainer> <nomeContainer></nomeContainer> <tipoContainer></tipoContainer> </RigaContainer> <RigaContainer> <nomeContainer></nomeContainer> <tipoContainer></tipoContainer> </RigaContainer> </TabellaContainer> </AreaContainer> </Context> </DHMESSAG> <TB00803O xmlns:cics="http://www.ibm.com/xmlns/prod/CICS/channel-instance" cics:structuredContainer="true"> <DatiUo> <DatiUoReturnCode> <DatiUoErrType></DatiUoErrType> <DatiUoCodErr> </DatiUoCodErr> <DatiUoMessErr> </DatiUoMessErr> </DatiUoReturnCode> <DatiOutput> <maxLiv>1</maxLiv> <maxOccurs>974</maxOccurs> <elemTabUo> <codUo>1234</codUo> <livello>1</livello> <indPadre>0</indPadre> <indFiglioFirst>2</indFiglioFirst> <indFiglioLast>9</indFiglioLast> <sportello> </sportello> <descUo>XXXXXXXXXXXX. </descUo> <tipoFil>D</tipoFil> <canaleCiCpRczl>XX</canaleCiCpRczl> <dataChiusura>01.01.0001</dataChiusura> <indMail>XXXXXXXXXXXXX </indMail> </elemTabUo> <elemTabUo> <codUo>XXXXXX</codUo> <livello>2</livello> <indPadre>1</indPadre> <indFiglioFirst>10</indFiglioFirst> <indFiglioLast>110</indFiglioLast> <sportello> </sportello> <descUo>XXXXXXXXXXXXXX </descUo> <tipoFil>A</tipoFil> <canaleCiCpRczl>XX</canaleCiCpRczl> <dataChiusura>01.01.0001</dataChiusura> <indMail>XXXXXXXXXXXXXX </indMail> </elemTabUo> </DatiOutput> </DatiUo> </TB00803O> </C1XAR080OperationResponse> </SOAP-ENV:Body> </SOAP-ENV:Envelope> 我需要将列表读入节点 TB00803O > DatiUO > DatiOutput > elemTabUo 这是读取节点 elemTabUo 的代码,但不起作用,我收到错误: 未将对象引用设置为对象的实例。 IRestResponse<TB00803O> restResponse2 = client.Execute<TB00803O>((IRestRequest)request); //maxOccurs work, I get number with children TextBox1.Text = restResponse2.Data.DatiUo.DatiOutput.maxOccurs; //If I try to read first children I get error TextBox1.Text = restResponse2.Data.DatiUo.DatiOutput.elemTabUo[0].codUo; //I get the same error also I fi try with foreach and I see only FIRST LINE foreach (var val in restResponse2.Data.DatiUo.DatiOutput.elemTabUo) { TextBox1.Text = "---FIRST LINE---\n"; TextBox1.Text = TextBox1.Text + val.codUo; } 我不明白为什么我无法读取List elemTabUo,但我可以读取maxOccurs... 感谢您的帮助 我在此链接中找到了一个很好的解决方案:parse Soap XML Response using c# at child Nodes 我创建了一个类并使用了 xml linq。 这是正确的代码: List<XElement> xEvents = doc.Descendants().Where(x => x.Name.LocalName == "elemTabUo").ToList(); ns = xEvents.FirstOrDefault().GetDefaultNamespace(); List<elemTabUo> events = xEvents.Select(x => new elemTabUo() { codUo = (string)x.Element(ns + "codUo"), livello = (string)x.Element(ns + "livello"), indPadre = (string)x.Element(ns + "indPadre"), indFiglioLast = (string)x.Element(ns + "indFiglioLast"), sportello = (string)x.Element(ns + "sportello"), descUo = (string)x.Element(ns + "descUo"), tipoFil = (string)x.Element(ns + "tipoFil"), canaleCiCpRczl = (string)x.Element(ns + "canaleCiCpRczl"), dataChiusura = (string)x.Element(ns + "dataChiusura"), indMail = (string)x.Element(ns + "indMail"), }).ToList(); TextBox1.Text ="Tot: " + events.Count.ToString(); TextBox1.Text = TextBox1.Text + "---INIZIO UO---\n"; int indice = 0; foreach (var val in events) { indice++; TextBox1.Text =TextBox1.Text + "\n" + indice + " " + val.codUo; } public class elemTabUo { public string codUo { get; set; } public string livello { get; set; } public string indPadre { get; set; } public string indFiglioFirst { get; set; } public string indFiglioLast { get; set; } public string sportello { get; set; } public string descUo { get; set; } public string tipoFil { get; set; } public string canaleCiCpRczl { get; set; } public string dataChiusura { get; set; } public string indMail { get; set; } }

回答 1 投票 0

如何将 SOAP 响应转换为 PHP 数组?

我无法将 SOAP 响应转换为 php 中的数组。 这是代码 $response = $client->__doRequest($xmlRequest,$location,$action,1); 这是 SOAP 响应。 我无法将 SOAP 响应转换为 php 中的数组。 这是代码 $response = $client->__doRequest($xmlRequest,$location,$action,1); 这是 SOAP 响应。 <soap:envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:body> <searchflightavailability33response xmlns="http://FpwebBox.Fareportal.com/Gateway.asmx"> <searchflightavailability33result> &lt;Fareportal&gt;&lt;FpSearch_AirLowFaresRS&gt;&lt;CntKey&gt;1777f5a7-7824-46ce-a0f8-33d5e6e96816&lt;/CntKey&gt;&lt;Currency CurrencyCode="USD"/&gt;&lt;OriginDestinationOptions&gt;&lt;OutBoundOptions&gt;&lt;OutBoundOption segmentid="9W7008V21Feb14"&gt;&lt;FlightSegment etc.... </searchflightavailability33result> </searchflightavailability33response> </soap:body> </soap:envelope>; 我使用以下方法转换为数组,但我得到空输出。 1.echo '<pre>';print_r($client__getLastResponse()); 2.echo '<pre>';print_r($response->envelope->body->searchflightavailability33response); 3.echo '<pre>';print_r($client->SearchFlightAvailability33($response)); 4.simplexml_load_string($response,NULL,NULL,"http://schemas.xmlsoap.org/soap/envelope/"); 5.echo '<pre>';print_r($client->SearchFlightAvailability33($response)); 请给我建议。 结合前面的方法,可以轻松地将以下 SOAP 响应结构转换为数组。仅使用函数“simplexml_load_string”删除冒号“:”在某些情况下返回 null。 SOAP 响应 <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> <S:Body> <ns2:transaccionResponse xmlns:ns2="http://ws.iatai.com/"> <respuestaTransaccion> <idTransaccion>94567</idTransaccion> <referencia>3958</referencia> <idEstado>3</idEstado> <nombreEstado>Declinada</nombreEstado> <codigoRespuesta>202</codigoRespuesta> <valor>93815.0</valor> <iva>86815.0</iva> <baseDevolucion>0.0</baseDevolucion> <isoMoneda>COP</isoMoneda> <fechaProcesamiento>24-07-2015 12:18:40 PM</fechaProcesamiento> <mensaje>REJECT</mensaje> <tarjetaRespuesta> <idFranquicia>1</idFranquicia> <nombreFranquicia>VISA</nombreFranquicia> <numeroBin>411111</numeroBin> <numeroProducto>1111</numeroProducto> </tarjetaRespuesta> <procesadorRespuesta> <idProcesador>3</idProcesador> </procesadorRespuesta> </respuestaTransaccion> </ns2:transaccionResponse> </S:Body> </S:Envelope> PHP 转换: $response = preg_replace("/(<\/?)(\w+):([^>]*>)/", "$1$2$3", $response); $xml = new SimpleXMLElement($response); $body = $xml->xpath('//SBody')[0]; $array = json_decode(json_encode((array)$body), TRUE); print_r($array); 结果: Array ( [ns2transaccionResponse] => Array ( [respuestaTransaccion] => Array ( [idTransaccion] => 94567 [referencia] => 3958 [idEstado] => 3 [nombreEstado] => Declinada [codigoRespuesta] => 202 [valor] => 93815.0 [iva] => 86815.0 [baseDevolucion] => 0.0 [isoMoneda] => COP [fechaProcesamiento] => 24-07-2015 12:18:40 PM [mensaje] => REJECT [tarjetaRespuesta] => Array ( [idFranquicia] => 1 [nombreFranquicia] => VISA [numeroBin] => 411111 [numeroProducto] => 1111 ) [procesadorRespuesta] => Array ( [idProcesador] => 3 ) ) ) ) 我找到了一个完美的解决方案来解析对数组的 SOAP 响应: $plainXML = mungXML( trim($soapXML) ); $arrayResult = json_decode(json_encode(SimpleXML_Load_String($plainXML, 'SimpleXMLElement', LIBXML_NOCDATA)), true); print_r($arrayResult); // FUNCTION TO MUNG THE XML SO WE DO NOT HAVE TO DEAL WITH NAMESPACE function mungXML($xml) { $obj = SimpleXML_Load_String($xml); if ($obj === FALSE) return $xml; // GET NAMESPACES, IF ANY $nss = $obj->getNamespaces(TRUE); if (empty($nss)) return $xml; // CHANGE ns: INTO ns_ $nsm = array_keys($nss); foreach ($nsm as $key) { // A REGULAR EXPRESSION TO MUNG THE XML $rgx = '#' // REGEX DELIMITER . '(' // GROUP PATTERN 1 . '\<' // LOCATE A LEFT WICKET . '/?' // MAYBE FOLLOWED BY A SLASH . preg_quote($key) // THE NAMESPACE . ')' // END GROUP PATTERN . '(' // GROUP PATTERN 2 . ':{1}' // A COLON (EXACTLY ONE) . ')' // END GROUP PATTERN . '#' // REGEX DELIMITER ; // INSERT THE UNDERSCORE INTO THE TAG NAME $rep = '$1' // BACKREFERENCE TO GROUP 1 . '_' // LITERAL UNDERSCORE IN PLACE OF GROUP 2 ; // PERFORM THE REPLACEMENT $xml = preg_replace($rgx, $rep, $xml); } return $xml; } // End :: mungXML() 它将为您提供完美的 SOAP XML 数据数组。 最后我找到了解决方案是 我们可以通过以下方式从 SOAP 获取响应正文 示例1: $xml = new SimpleXMLElement($soapResponse); foreach($xml->xpath('//soap:body') as $header) { $output = $header->registerXPathNamespace('default', 'http://FpwebBox.Fareportal.com/Gateway.asmx'); } 示例2: $doc = new DOMDocument('1.0', 'utf-8'); $doc->loadXML( $soapResponse ); $XMLresults = $doc->getElementsByTagName("SearchFlightAvailability33Response"); $output = $XMLresults->item(0)->nodeValue; Php 解析 SOAP 响应到数组 $xml = file_get_contents($response); // SimpleXML seems to have problems with the colon ":" in the <xxx:yyy> response tags, so take them out $xml = preg_replace(“/(<\/?)(\w+):([^>]*>)/”, “$1$2$3″, $xml); $xml = simplexml_load_string($xml); $json = json_encode($xml); $responseArray = json_decode($json,true); 我使用 DOMDocument 获得了一个值。 $soap_response = $client->__getLastResponse(); $dom_result = new DOMDocument; if (!$dom_result->loadXML($soap_response)) throw new Exception(_('Error parsing response'), 11); $my_val = $dom_result->getElementsByTagName('my_node')->item(0)->nodeValue; @gtrujillos 的第二个答案对我有用,但有一些更改,因为在我的情况下,json 字符串需要更多格式化代码,并且 xPath 需要采用这种方式“//S:Body”。这是最终解决我的问题的代码。我采用了相同的 SOAP 响应示例以及用于获取和返回 Soap 响应的代码,我在here:找到了它 PHP 转换 //getting the Soap Response header("Content-Type: text/xml\r\n"); ob_start(); $capturedData = fopen('php://input', 'rb'); $content = fread($capturedData, 5000); fclose($capturedData); ob_end_clean(); //getting the SimpleXMLElement object $xml = new SimpleXMLElement($content); $body = $xml->xpath('//S:Body')[0]; //transform to json $json = json_encode((array)$body); //Formatting the JSON $json = str_replace(array("\n","\r","?"),"",$Json); $json = preg_replace('/([{,]+)(\s*)([^"]+?)\s*:/','$1"$3":',$json); $Json = preg_replace('/(,)\s*}$/','}',$json); //Getting the array $array=json_decode($Json,true); //whatever yo need to do with the array ... //Return a Soap Response $returnedMsg=true;//this will depend of what do you need to return print '<?xml version="1.0" encoding="UTF-8"?> <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <soapenv:Body> <notifications xmlns="http://soap.sforce.com/2005/09/outbound"> <Ack>' . $returnedMsg . '</Ack> </notifications> </soapenv:Body> </soapenv:Envelope>'; SOAP 可以被简单地理解为 XML,但您应该考虑命名空间。这对于 PHP 的 DOM 来说并不困难。在您的示例中,SOAP 使用内部节点的命名空间,并且 {http://FpwebBox.Fareportal.com/Gateway.asmx}searchflightavailability33result 元素包含另一个 XML 文档作为文本内容。 $xml = <<<'XML' <soap:envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:body> <searchflightavailability33response xmlns="http://FpwebBox.Fareportal.com/Gateway.asmx"> <searchflightavailability33result> &lt;Fareportal&gt;&lt;FpSearch_AirLowFaresRS&gt;&lt;CntKey&gt;1777f5a7-7824-46ce-a0f8-33d5e6e96816&lt;/CntKey&gt;&lt;Currency CurrencyCode="USD"/&gt;&lt;/FpSearch_AirLowFaresRS&gt;&lt;/Fareportal&gt; </searchflightavailability33result> </searchflightavailability33response> </soap:body> </soap:envelope> XML; // define a constant for the namespace URI const XMLNS_FPW = 'http://FpwebBox.Fareportal.com/Gateway.asmx'; $document = new DOMDocument(); $document->loadXML($xml); $xpath = new DOMXpath($document); // register a prefix for the namespace $xpath->registerNamespace('fpw', XMLNS_FPW); // read the result element text content $result = $xpath->evaluate('string(//fpw:searchflightavailability33result)'); var_dump($result); // load the result string as XML $innerDocument = new DOMDocument(); $innerDocument->loadXML($result); $innerXpath = new DOMXpath($innerDocument); // read data from it var_dump($innerXpath->evaluate('string(//CntKey)')); 就我而言,我使用了 $body = $xml->xpath('//soapBody')[0]; $response = preg_replace("/(<\/?)(\w+):([^>]*>)/", "$1$2$3", $response); $xml = new SimpleXMLElement($response); $body = $xml->xpath('//SBody')[0]; $array = json_decode(json_encode((array)$body), TRUE); print_r($array); 对其中一个答案进行了小小的更改,因为我的 SOAP 响应有 s:Body 而不是 S:Body: $response1 = preg_replace("/(<\/?)(\w+):([^>]*>)/", "$1$2$3", $response); $xml = new SimpleXMLElement($response1); $body = $xml->xpath('//sBody')[0]; $array = json_decode(json_encode((array)$body), TRUE); p_debug($array); $myfile = fopen("req_resposta.xml", "w") or die("Unable to open file!"); fwrite($myfile, $response1); fclose($myfile);

回答 9 投票 0

如何在android中使用soap webservice

我是android的新用户。我想使用肥皂网络服务。我找到了很好的例子,但它们对我不起作用:-( 这是我的网络服务的网址: http://parsnerkh.com/webservice/server.wsdl? 和

回答 1 投票 0

将动态值类型 Date 传递到 tSOAP Message

我想通过使用全局变量将这种格式“yyyy-MM-dd”(例如:2023-09-06)的值类型日期传递给 tSOAP 消息,但不成功。它总是给我这个值 Wed Sep 06 00:0...

回答 1 投票 0

Wiremock 独立 - 从模拟 Soap 服务的请求 xml 中获取值

我一直在尝试使用独立的wiremock 为SOAP 服务创建一个存根系统。我已经准备好response.xml,并且需要根据 SOAP 请求 xml 中的 id 值返回它们...

回答 1 投票 0

从使用 Spring Boot 开发的肥皂请求中检索自定义标头详细信息

我使用 Spring Boot 开发了肥皂请求,其中我的肥皂请求在“soapenv:Header”的“”部分中包含自定义牧民。我面临检索详细信息的问题...

回答 1 投票 0

使用 mutlipart/form-data 在 SOAP 中发送 XML

我开始使用 SOAP Web 服务,该服务要求所有请求都是 POST。我没有太多 SOAP/XML 经验,因此非常感谢您的指导。 虽然我已经用谷歌搜索了很多...

回答 1 投票 0

Web 服务错误:System.Web.Services.Protocols.SoapException 区域性名称“en-il”不受支持

虽然这类似于如何解决此异常“文化不受支持”?我想我应该将其发布为特定于从 .NET 应用程序访问 Web 服务的内容。我最近发...

回答 1 投票 0

无法在 Java 17 中创建 SAAJ 元工厂

启动我的 Spring Boot 应用程序时出现以下错误 导致:org.springframework.ws.soap.SoapMessageCreationException:无法创建SAAJ MessageFactory:无法创建...

回答 1 投票 0

.NET SOAP 客户端使用:Array

我正在尝试添加位于此处的 SOAP 端点:http://ds.hitpromo.net/product 但是我收到以下错误: 脚手架代码...错误:错误:无法导入 wsdl:portType 详细信息: 一个

回答 3 投票 0

DocuSign SOAP API - 错误:此帐户缺乏足够的权限

我目前正在遵循有关如何使用 SOAP API 请求签名的操作指南 我已经导入了 wsdl 并设法创建了我的信封,但是当我尝试发送它时,我遇到了以下错误:...

回答 1 投票 0

XML 格式问题

我是第一次使用 Salesforce SOAP API,所以我不熟悉 SOAP 格式问题等。我使用 lxml 库生成 XML,但似乎有格式问题...

回答 3 投票 0

JAVA spring SOAP 响应中句柄字符串为空

我在春季使用 jaxb 进行肥皂服务。我有一个字段“名称”,其值为空字符串(“”)。 我发现api的响应是 但我想要 我在春天使用 jaxb 进行肥皂服务。我有“名称”字段,其值为空字符串(“”)。 我发现api的响应是 <name/> 但是我想要 <name></name> 我在下面有集合的定义和测试名称案例,但仍然不匹配。 是否可以配置 JAXB 或创建一些适配器来修复它。 @XmlElement(required = true, nillable = true) protected String name; @XmlElement() protected String name; @XmlElement(required = false) protected String name; 在 XML 中,<name/> 和 <name></name> 的处理方式相同,都表示空元素。即使您设法创建后一种表示形式,您也必须告诉 XML 文档的对应部分您赋予了它特殊的含义。这不是一个好主意。 也许这会对您有所帮助:当使用 JAXB 进行解组时,<name/> 的纯粹存在会导致空字符串,而缺少元素会导致字符串为 null。

回答 1 投票 0

使用 .NET 7 的 SOAP:生成的内容与原始版本不同

我正在将遗留项目从 .Net Framework 4.6.1 转换为 .Net 7。 该项目使用 SOAP 服务并且是一个 VB 项目,因此使用添加“Web 引用”向导添加服务,但是...

回答 1 投票 0

使用HTTP方法设计API

我最近在 Netskope 系统设计面试中被问到以下问题,即为以下功能设计 API(带有 HTTP 方法的完整 URL 路径),但我无法很好地回答,所以我被拒绝了。我...

回答 1 投票 0

如何将 WAS Soap 服务转变为现代休息服务

我手里有一个又大又旧的WebSphere服务。该服务基本上适用于大多数帐户操作,例如打开、关闭、更新等。我们在 IBM WebSp 上使用 Spring - Core 项目...

回答 1 投票 0

NetSuite 销售订单。更新某些订单项的字段

PHP 和 NS2015_2 SDK。想要更新销售订单中某些项目的字段。假设我们要更新列表中第二行/项目的金额。 我的代码示例如下: $Service = 新的 NetSuiteService($

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.