Python suds error Ошибка сервера: «Session expired»

1

Я пытаюсь написать скрипт python для вызова методов API SOAP PHP. Я получил все, чтобы успешно получить необходимые токены, но когда я на самом деле пытаюсь вызвать любой метод, я получаю сообщение об ошибке.

Вот код, который я использую, с некоторыми измененными данными

from suds.client import Client
from suds.xsd.doctor import ImportDoctor, Import
import logging
from suds import WebFault
import suds


username = "apiUserAccount"
password = "apiPassword"
keyword = "computerNameImSearchingFor"

logging.getLogger('suds.client').setLevel(logging.CRITICAL)

url = 'url/to/service.php?wsdl'  # wsdl api url
tns = 'url/to/api/'  # target name space from php
#fixing broken schema
imp = Import('http://schemas.xmlsoap.org/soap/encoding/')
imp.filter.add(tns)

client = Client(url, plugins=[ImportDoctor(imp)])  # calling api
print client

#This calls the request for an authentication token
auth_token = client.service.auth_request_api(username, password)
username = "myUserName"
password = "myPassword"
user_login = client.service.auth_request_user(auth_token, username, password)
#this works
print "api token: " + api_token
#this also works
print "login token: " + login

#This doesn't work...
try:
    print client.service.search_in_namehost(user_login, keyword)
except suds.WebFault as detail:
    print detail

Ошибка вызывается в вызове метода search_in_namehost, вот вывод, я удалил часть из него ради космоса

Suds ( https://fedorahosted.org/suds/ )  version: 0.4 GA  build: R699-20100913

Service ( SERVICENAME ) tns="address/to/server/api/"
   Prefixes (2)
      ns0 = "http://schemas.xmlsoap.org/soap/encoding/"
      ns1 = "http://address/to/server/api/"
   Ports (1):
      (SERVICENAME_serviceSoap)
         Methods (20):
            auth_request_api(xs:string username, xs:string password, )
            auth_request_user(xs:string auth_token, xs:string username, xs:string password, )
            search_in_namehost(xs:string login_token, xs:string keyword, )
         Types (50):
            ns0:Array
            ns0:ENTITIES
            ns0:ENTITY
            ns0:ID
            ns0:IDREF
            ns0:IDREFS

api token: alphaNumericApiToken
login token: alphaNumericApiToken
Traceback (most recent call last):
  File "/path/to/my/python/script.py", line 42, in <module>
    result = client.service.incidents_list(user_login)
  File "build/bdist.macosx-10.10-intel/egg/suds/client.py", line 542, in __call__
  File "build/bdist.macosx-10.10-intel/egg/suds/client.py", line 602, in invoke
  File "build/bdist.macosx-10.10-intel/egg/suds/client.py", line 643, in send
  File "build/bdist.macosx-10.10-intel/egg/suds/client.py", line 678, in succeeded
  File "build/bdist.macosx-10.10-intel/egg/suds/bindings/binding.py", line 154, in get_reply
  File "build/bdist.macosx-10.10-intel/egg/suds/bindings/binding.py", line 498, in returned_types
  File "build/bdist.macosx-10.10-intel/egg/suds/bindings/binding.py", line 441, in bodypart_types
suds.TypeNotFound: Type not found: '(array, http://internalserver/servicename/api/, )'

Process finished with exit code 1

Когда я создал файл test.php для вызова методов с использованием документации, я получаю нужные данные. Вот код php:

<?php
include("soapclient.php");

$tech_username = "api_user";
$tech_password = "apipassword";
$username = "user";
$password = "password";
$keyword = "computername";
$client = new SERVICE_serviceSoapClient();
$api_token = $client->auth_request_api($tech_username, $tech_password);
$user_token = $client->auth_request_user($api_token, $username, $password);
print_r($client->search_in_namehost($user_token, $keyword));
?>

И это то, что я получаю, когда запускаю php test.php в терминале

test.php выводит это в терминал

localhost:Documents username$ sudo php phpinfo.php 
Array
(  
    [0] => Array
        (
            [title] => computername
            [section] => Hosts
            [incident] => Test Incident - DO NOT DELETE
            [url] => https://urlToIncident
        )

)

Учитывая, что я могу успешно получить данные, я знаю, что проблема - это что-то с пеной, но у меня есть минимальный опыт работы с PHP и использованием пены, а также документация для обоих пеной и API, с которыми я работаю, не столь надежны, как хотелось бы, Буду признателен за любую помощь, которую я могу получить.

UPDATE Извините, если я не отредактировал это право, я новичок в фактической публикации здесь, но я сделал некоторый прогресс...

Поэтому сотрудник, знакомый с SOAP, но не python, предложил мне изменить способ передачи параметров вызовам метода. Поэтому я сделал это и отредактировал вышеописанный код, а также вывод с новой ошибкой, которую я получаю. На этом этапе я уверен, что python получает информацию из метода, но не может справиться с тем, как он представлен.

Как я уже упоминал выше, как выглядит вывод в терминале при вызове test.php, я подсчитал, сколько времени потребовалось, чтобы вернуть его по сравнению с тем, сколько времени потребовалось, чтобы вернуть эту новую ошибку после того, как скрипт получил этот вызов метода, и они примерно то же самое. Раньше я почти сразу получал ошибку с истекшим сроком действия. Поэтому теперь я полагаю, что проблема заключается в том, что python обрабатывает данные, которые он получает правильно, и теперь я работаю над поиском.

Теги:
soap
suds

1 ответ

0

Благодаря некоторой помощи со стороны коллеги он обнаружил, что проблема связана с WSDL, который я использовал. Suds искал тип массива, которого не было. Как только я изменил все экземпляры этого типа в WSDL, все работало нормально. К сожалению, я не могу опубликовать WSDL, но я с удовольствием отвечаю на вопросы, насколько это возможно, если у кого-то это случится.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню