服务器抛出错误:'Session expired'


Python suds error Server raised fault: 'Session expired'

我正在尝试编写一个python脚本调用SOAP PHP API方法。我已经让它成功地获得所需的令牌,但当我实际尝试调用任何方法时,我得到一个错误。

这是我正在使用的代码,与某些数据编辑

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
        )
)

给定我可以成功地获得数据,我知道问题是与suds的东西,但我有最少的经验与PHP和使用suds和文档的suds和我正在使用的API都不像我想的那么强大。如果能得到任何帮助,我将不胜感激。

对不起,如果我没有编辑正确,我是新的,实际上张贴在这里,但我已经取得了一些进展…

因此,熟悉SOAP但不熟悉python的同事建议我改变向方法调用传递参数的方式。所以我这样做了,并相应地编辑了上面的代码以及我得到的新错误的输出。在这一点上,我确信python正在从方法中获取信息,但不一定能处理它的呈现方式。

正如我上面提到的调用test.php时终端中的输出是什么样子,我计算了返回test.php所花费的时间与脚本调用该方法后返回这个新错误所花费的时间,它们大致相同。以前,我几乎立即得到会话过期错误。所以现在我想问题是让python处理它正确得到的数据,我现在正在努力弄清楚。

多亏了一位同事的帮助,他发现问题出在我使用的WSDL上。Suds在寻找一种不存在的数组类型。一旦我在WSDL中更改了该类型的所有实例,一切都会正常工作。不幸的是,我不能发布WSDL,但如果有人碰巧有任何问题,我很乐意尽我所能回答。