2012-07-25 4 views
1

Я пытаюсь разобрать ответ SOAP с сервера. Я 100% новичок в SOAP и довольно новый для общения с использованием HTTP/HTTPS. Я использую Python 2.7 на Ubuntu 12.04.Анализ SOAP-ответа в Python

Похоже, 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 

С другой StackOverflow post я сделал вывод, что SOAP-ENV:Body может быть причиной проблемы пространства имен. (Я мог ошибаться.)

Я проделал другие поиски, чтобы найти хорошее решение для синтаксического анализа SOAP, но большинство из них от 3 лет назад. Кажется, что suds очень рекомендуется. Я хотел получить «обновленные» рекомендации, прежде чем я слишком далеко продвинулся по пути.

Может ли кто-нибудь порекомендовать прочный (и простой) способ разобрать ответ SOAP, как тот, который я получил выше? Было бы признательно, если бы вы могли представить простой пример, чтобы начать меня (как я сказал выше, я совершенно не знаком с SOAP).

ответ

0

Мне не удалось найти прямой подход, используя Python. Вместо этого я решил использовать PHP.

Многое, как следующее:

Python:

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 за his solution для разбора SOAP таким образом, чтобы , наконец, имел смысл для меня.

0

EDITED: Работа с SOAP в Python - это действительно весело - большинство инструментов не поддерживаются годами. Если говорить об особенностях - возможно, ZSI является лидером. Но у него много ошибок, если речь идет о поддержке более сложных схем XSD (только один пример - он не поддерживает объединения и сложные типы на основе расширений, где расширенный тип не является базовым типом). Suds очень прост в использовании, но не настолько мощный, как ZSI - он имеет худшую поддержку некоторых сложных конструкций XSD, чем ZSI. Есть интересный инструмент - generateDS, который работает с XSD, а не напрямую с WSDL - вам нужно реализовать методы самостоятельно. Но на самом деле это действительно хорошая работа.

+0

К сожалению, я заметил это раньше и забыл обновить вопрос. – Rico

+0

Редактированный вопрос и пример для меня работают. Я не получаю эту ошибку ... Что-то не хватает? – Tisho

+0

Я так не думаю ... Я, должно быть, просто пропустил первый конверт. = -/ – Rico