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