python spyne服务 - base64字符串来自转义

时间:2013-03-12 08:25:35

标签: python base64 spyne

我有一个简单的间谍服务:

class JiraAdapter(ServiceBase):
    @srpc(Unicode, String, Unicode, _returns=Status)
    def CreateJiraIssueWithBase64Attachment(summary, base64attachment, attachment_filename):
        status = Status
        try:
            newkey = jira_client.createWithBase64Attachment(summary, base64attachment, attachment_filename)
            status.Code = StatusCodes.IssueCreated
            status.Message = unicode(newkey)
        except Exception as e:
            status.Code = StatusCodes.InternalError
            status.Message = u'Internal Exception: %s' % e.message
        return status

问题是某些程序会在生成的base64string中插入'\ n',每隔60个字符左右,它将进入服务的方法转义('\\ n'),导致事情表现奇怪。是否有设置或某些东西可以避免这种情况?

1 个答案:

答案 0 :(得分:0)

首先,关于您发布的代码的一些评论:

  1. 您必须实例化您的类型(即status = Status()而不是status = Status)。实际上,您要在Status类上设置类属性。不仅仅是错误,你还通过在没有正确锁定的情况下改变全局状态来创建竞争条件。

  2. Jira有办法用二进制数据创建问题吗?您可以使用ByteArray来处理base64编码/解码。请注意,ByteArray被反序列化为一系列字符串。

  3. 您可以定义自定义base64类型:

    Base64String = String(pattern='[0-9a-zA-Z/+=]+')
    

    ...并使用它而不是普通String以及验证来毫不费力地拒绝无效输入。

  4. 除了返回“状态”对象之外,我什么都不返回,只需在需要时引发异常(或者你可以让原始异常冒泡)。异常也像普通对象一样被序列化。但这是您的决定,因为这取决于您希望如何使用API​​。

  5. 现在提出原来的问题:

    你会同意在这里做的正确的事情是将任何逃脱'\ n'(即0x0a)的东西修复为r“\ n”(即0x5c 0x6e)。

    如果您想处理它,我想您评论中的解决方案(即base64attachment = base64attachment.decode('string-escape'))将是最佳解决方案。

    我希望有所帮助。

    致以最诚挚的问候,