代码之家  ›  专栏  ›  技术社区  ›  n1r3

python+suds:xsd_base64二进制类型?

  •  1
  • n1r3  · 技术社区  · 15 年前

    我正在尝试使用SOAP API将一些文件附加到JIRA。 我有python 2.6,而soappy已经不工作了,所以我在用肥皂水。除了附件外一切都很好…我不知道如何重写这段代码: 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 回复  |  直到 14 年前
        1
  •  1
  •   paragbaxi    14 年前

    如果您不想使用Java CLI,下面是如何在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')])
    
        2
  •  0
  •   amadain    14 年前

    不知道这是否有帮助,但是当我使用python时,我发现在大多数复杂类型的包中都明显缺乏支持。最后,我决定使用zsi及其wsdl2py--complextype wsdl_url。这很管用。我的WSDL中有许多复杂的类型,以及WSDL中定义的数组数组数组。wsdl2py生成访问WSDL时使用的3个lib。下面是一个调用方法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)
    

    不知道这有什么帮助吗

        3
  •  0
  •   paragbaxi    14 年前

    可以使用jira cli(使用suds用python编写)将文件附加到问题。 The standalone code 在LGPL许可证下可用。

    您将使用的命令是“attach”。

    更新:python cli不工作。

    在python 2.7下使用此CLI附加文件时出错:

    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 CLI工作。

    我只是打电话给 Java CLI 它工作!

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