0

我有一个简单的 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

问题是一些程序会在每 60 个字符左右插入 '\n' 到生成的 base64string 中,并且它会进入服务的方法,转义('\\n')导致事情表现得很奇怪。有没有设置或什么可以避免这种情况?

4

1 回答 1

0

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

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

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

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

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

    ...并使用它而不是简单String的验证来轻松拒绝无效输入。

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

现在对于您的原始问题:

你会同意在这里做的正确的事情是将任何转义的 '\n'(即 0x0a)修复为 r"\n"(即 0x5c 0x6e)。

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

我希望这会有所帮助。

最好的祝福,

于 2013-03-13T10:50:07.513 回答