1

SOAPサーバーからの応答を解析しようとしています。私は 100% が初めてで、 /SOAPを使用して通信するのはかなり初めてです。Ubuntu 12.04 で Python 2.7 を使用しています。HTTPHTTPS

SOAPのように見えますXML。ただし、そのように解析できないようです。使用しようとしましElementTreeたが、エラーが発生し続けます。SOAP検索から、タグに問題がある可能性があると結論付けることができました。(私はここから離れている可能性があります...私がそうである場合はお知らせください。)

したがって、ここSOAPに私が持っているメッセージの例と、それを解析するために何をしようとしているかを示します (これは、関連する場合に備えて、Link Point Gateway からの実際のサーバー応答です)。

import xml.etree.ElementTree as ET
soap_string = '<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Body><fdggwsapi:FDGGWSApiOrderResponse xmlns:fdggwsapi="http://secure.linkpt.net/fdggwsapi/schemas_us/fdggwsapi"><fdggwsapi:CommercialServiceProvider/><fdggwsapi:TransactionTime>Wed Jul 25 10:26:40 2012</fdggwsapi:TransactionTime><fdggwsapi:TransactionID/><fdggwsapi:ProcessorReferenceNumber/><fdggwsapi:ProcessorResponseMessage/><fdggwsapi:ErrorMessage>SGS-002303: Invalid credit card number.</fdggwsapi:ErrorMessage><fdggwsapi:OrderId>1</fdggwsapi:OrderId><fdggwsapi:ApprovalCode/><fdggwsapi:AVSResponse/><fdggwsapi:TDate/><fdggwsapi:TransactionResult>FAILED</fdggwsapi:TransactionResult><fdggwsapi:ProcessorResponseCode/><fdggwsapi:ProcessorApprovalCode/><fdggwsapi:CalculatedTax/><fdggwsapi:CalculatedShipping/><fdggwsapi:TransactionScore/><fdggwsapi:FraudAction/><fdggwsapi:AuthenticationResponseCode/></fdggwsapi:FDGGWSApiOrderResponse></SOAP-ENV:Body></SOAP-ENV:Envelope>'
targetTree = ET.fromstring(soap_string)

これにより、次のエラーが発生します。

unbound prefix: line 1, column 0

別のスタックオーバーフローの投稿SOAP-ENV:Bodyから、名前空間の問題を引き起こしている可能性があると結論付けました。(私は間違っているかもしれません。)

解析に適した解決策を見つけるために他の検索を行いましたSOAPが、それらのほとんどは 3 年以上前のものです。がかなりオススメのようです。行き過ぎてしまう前に、「更新された」推奨事項を入手したかったのです。

SOAP上記で受け取ったような応答を解析するための堅実な (そして簡単な) 方法を誰かが推奨できますか? 私が始めるための簡単な例を提供していただければ幸いです(上記で述べたように、私は完全に初心者ですSOAP)。

4

2 に答える 2

0

編集: Python で SOAP を操作するのは本当に楽しいです。ほとんどのツールは何年も保守されていません。機能について言えば、 ZSIがリーダーかもしれません。しかし、より複雑な XSD スキーマをサポートするようになると、多くのバグがあります (ほんの一例 - 拡張型が基本型ではない、拡張に基づく共用体と複合型はサポートされません)。 Sudsは非常に使いやすいですが、ZSI ほど強力ではありません。いくつかの複雑な XSD 構造のサポートは、ZSI より劣っています。generateDSという興味深いツールがあります。これは、 WSDL ではなく XSD で動作します。メソッドを自分で実装する必要があります。しかし、実際にはかなり良い仕事をしています。

于 2012-07-25T21:54:33.313 に答える
0

Python を使用した簡単なアプローチを見つけることができませんでした。代わりに PHP を使用することにしました。

次のようになります。

パイソン:

import subprocess
command = 'php /path/to/script.php "{1}"'.format(soap_string)
process = subprocess.Popen(command, shell = True, stderr = subprocess.PIPE, stdout = subprocess.PIPE)
process.wait()
output = process.communicate()[0]
(error, result, order_id) = output.split(',')

PHP:

#!/usr/bin/php
<?php

$soap_response = $argv[1];

$doc = simplexml_load_string($soap_response);
$doc->registerXPathNamespace('fdggwsapi', 'http://secure.linkpt.net/fdggwsapi/schemas_us/fdggwsapi');
$nodes = $doc->xpath('//fdggwsapi:FDGGWSApiOrderResponse/fdggwsapi:ErrorMessage');
$error = strval($nodes[0]);

$nodes = $doc->xpath('//fdggwsapi:FDGGWSApiOrderResponse/fdggwsapi:TransactionResult');
$result = strval($nodes[0]);

$nodes = $doc->xpath('//fdggwsapi:FDGGWSApiOrderResponse/fdggwsapi:OrderId');
$order_id = strval($nodes[0]);

$array = array($error, $result, $order_id);
$response = implode(',', $array);

echo $response;

このコードは、この特定のSOAP応答の特定の側面のみを解析します。問題を解決するには、それで十分なはずです。

PHPに関しては、私は完全な初心者です(Perlを少し使用したので役に立ちました)。最終的に私にとって意味のある方法で解析する彼の解決策について、 @scoffeyに感謝しなければなりません。SOAP

于 2012-07-25T21:34:29.097 に答える