Python+suds : xsd_base64Binary类型?

1 投票
3 回答
2372 浏览
提问于 2025-04-15 19:24

我正在尝试通过Soap API将一些文件附加到Jira上。现在我用的是Python 2.6,但SOAPpy不再工作,所以我改用了suds。其他部分都没问题,就是附件这块……我不知道该怎么改写这段代码:http://confluence.atlassian.com/display/JIRA/Creating+a+SOAP+Client?focusedCommentId=180943#comment-180943

有没有什么线索?

我不知道该如何处理像这样的复杂类型:

<complexType name="ArrayOf_xsd_base64Binary">
<complexContent>
<restriction base="soapenc:Array">
<attribute ref="soapenc:arrayType" wsdl:arrayType="xsd:byte[][]"/>
</restriction>
</complexContent>
</complexType>

非常感谢

n.

3 个回答

0

你可以通过Jira命令行工具(这个工具是用Python写的,使用了suds库)来给问题添加文件。这个独立的代码是根据LGPL许可证发布的。

你需要使用的命令是“attach”,也就是“添加”的意思。

更新:Python命令行工具不工作。

我在使用这个Python 2.7的命令行工具添加文件时遇到了错误:

Traceback (most recent call last):
  File "./jira", line 1281, in <module>
    rc = com.run(command_name, logger, jira_env, args[1:])
  File "./jira", line 1080, in run
    return self.commands[command].dispatch(logger, jira_env, args)
  File "./jira", line 70, in dispatch
    results = self.run(logger, jira_env, args)
  File "./jira", line 140, in run
    logger.error(decode(e))
  File "./jira", line 1142, in decode
    str = e.faultstring
AttributeError: 'exceptions.NameError' object has no attribute 'faultstring'

更新2:Java命令行工具可以工作。

我直接调用了Java命令行工具,结果可以正常工作!

# Run JAVA CLI attach script
args = [
    './jira.sh',
    '--action',
    'addAttachment',
    '--project',
    project_title,
    '--issue',
    issue_key,
    '--file',
    '%s/%s' % (path, filename),
    ]
output = subprocess.check_output(args, cwd = path_to_java_cli).decode("utf-8")
0

我不知道这是否有帮助,但我在使用Python处理WSDL时,发现大多数包对复杂类型的支持非常有限。最后,我选择了zsi和它的wsdl2py工具,使用命令--complexType wsdl_url。这个方法效果很好。我的WSDL里有很多复杂类型,里面定义了多层嵌套的数组。wsdl2py会生成三个库,你在访问WSDL时需要用到它们。下面是一个调用方法createSubscribers的例子,这个方法接受一组值的数组。

import inspect, sys
from PolicyManagementService_client import *

class apiCheckSetup:
    def __init__(self, host="10.10.10.23", port="8080", log=None):
        """Setup to run wsdl operations"""
        self.loc=PolicyManagementServiceLocator(host, port)
        if log:
            logfile=log
        else:
            logfile=sys.stdout
        kw = { 'tracefile'    :    logfile}
        self.port=self.loc.getPolicyManagementPort(**kw)

    def createSubscribers(self, subList):
        req=createSubscribers()
        subscriberList=ns0.subscriberDetailsList_Def("subscriberList")
        subscriber=ns0.subscriberDetails_Def("subscriber")
        subUsers=subscriberList.pyclass()
        for element in subList:
            sub=subscriber.pyclass()
            sub.set_attribute_msisdn(element['msisdn'])
            sub.set_attribute_policyID(element['policyID'])
            sub.set_attribute_firstName(element['firstName'])
            sub.set_attribute_lastName(element['lastName'])
            subUsers._subscriber.append(sub)
        req._subscribers=subUsers
        self.port.createSubscribers(req)

你可以这样调用:

subList=[{'msisdn' : '+445555555', 'policyID' :  pid, 'firstName' : 'M1', 'lastName' : 'D1'}, {'msisdn' : '+445555556', 'policyID' :  pid, 'firstName' : 'M2', 'lastName' : 'D2'}] 
    self.api=pmcApiMethods.apiCheckSetup(host=testConfig.pmcApiServer, port=testConfig.pmcApiPort)
    self.api.createSubscribers(subList)

我不知道这是否有帮助

1

如果你不想使用Java的命令行工具,下面是如何在Python中添加附件的方法。

from suds.client import Client
client = Client(url_to_wsdl_file)
auth = client.service.login(username, password)

client.service.addBase64EncodedAttachmentsToIssue(auth, issue_key, [filename.encode("utf-8")], [open(full_path_and_filename, "rb").read().encode('base64')])

撰写回答