使用 Latin-1 编码 Spyne SOAP XML 响应

Posted

技术标签:

【中文标题】使用 Latin-1 编码 Spyne SOAP XML 响应【英文标题】:Encoding Spyne SOAP XML response with Latin-1 【发布时间】:2019-08-21 16:20:04 【问题描述】:

我最近设置了一个用于发送 XML 响应的 Spyne 应用程序。就目前而言,应用程序正在正确地发送响应——但是,它当前正在发送一个 UTF-8 编码的文档。我想将文档作为 Latin-1 (iso-8859-1) 编码发送。

我尝试使用“encoding=”参数,但除了更改标头之外,它似乎对响应没有任何影响。

以下是我的应用程序的代码:

import logging
from spyne import Application, rpc, ServiceBase, Integer, Unicode, AnyDict
from spyne import Iterable
from spyne.protocol.soap import Soap11
from spyne.protocol.xml import XmlDocument
from spyne.server.wsgi import WsgiApplication

class CoreService(ServiceBase):
    @rpc(Unicode, Unicode, Integer, Integer, _returns=AnyDict) #@rpc arguments corespond to the retrieve_score() arguments below
    def retreive_score(ctx):
        return score # This is a dictionary

application = Application([CoreService], 'spyne.iefp.soap',
                          in_protocol=Soap11(validator='lxml'),
                          out_protocol=XmlDocument(polymorphic=True, encoding='iso-8859-1'))

wsgi_application = WsgiApplication(application)

if __name__ == '__main__':
    import logging

    from wsgiref.simple_server import make_server

    logging.basicConfig(level=logging.DEBUG)
    logging.getLogger('spyne.protocol.xml').setLevel(logging.DEBUG)

    logging.info("listening on port 8000")
    logging.info("wsdl is at: http://10.10.28.84:8000/?wsdl")

    server = make_server('0.0.0.0', 8000, wsgi_application)
    server.serve_forever()

【问题讨论】:

【参考方案1】:

我修复了(并切换到 HttpRpc 进行输入,因为我手边没有 SOAP 客户端)并运行了您的代码。它对我有用。

import logging
from spyne import Application, rpc, ServiceBase, Integer, Unicode, AnyDict
from spyne import Iterable
from spyne.protocol.soap import Soap11
from spyne.protocol.http import HttpRpc
from spyne.protocol.xml import XmlDocument
from spyne.server.wsgi import WsgiApplication


class CoreService(ServiceBase):

    @rpc(Unicode, Unicode, Integer, Integer, _returns=AnyDict)
    def retrieve_score(ctx, s1, s2, i1, i2):
        return 'rain': u'yağmur'  # This is a dictionary


application = Application([CoreService], 'spyne.iefp.soap',
    in_protocol=HttpRpc(),
    out_protocol=XmlDocument(polymorphic=True, encoding='iso-8859-9'))

wsgi_application = WsgiApplication(application)

if __name__ == '__main__':
    import logging

    from wsgiref.simple_server import make_server

    logging.basicConfig(level=logging.DEBUG)
    logging.getLogger('spyne.protocol.xml').setLevel(logging.DEBUG)

    logging.info("listening on port 8000")
    logging.info("wsdl is at: http://127.0.0.1:8000/?wsdl")

    server = make_server('0.0.0.0', 8000, wsgi_application)
    server.serve_forever()

curl -s localhost:8000/retrieve_score | hexdump -C的摘录是:

00000070  65 5f 73 63 6f 72 65 52  65 73 75 6c 74 3e 3c 72  |e_scoreResult><r|
00000080  61 69 6e 3e 79 61 f0 6d  75 72 3c 2f 72 61 69 6e  |ain>ya.mur</rain|
00000090  3e 3c 2f 6e 73 30 3a 72  65 74 72 69 65 76 65 5f  |></ns0:retrieve_|

根据:https://en.wikipedia.org/wiki/ISO/IEC_8859-9,你有 0xF0 表示“ğ”,这是正确的

【讨论】:

以上是关于使用 Latin-1 编码 Spyne SOAP XML 响应的主要内容,如果未能解决你的问题,请参考以下文章

基于Python的Webservice开发-如何用Spyne开发Webservice

如何在 url 上使用带有参数的 Spyne+Django?

如何测试 SOAP Web 服务的 RPC?

使用 pd.concat() 函数后的问题 - 编码 latin-1 - 德语字符

使用 .NET 如何将包含 Latin-1 重音字符的 ISO 8859-1 编码文本文件转换为 UTF-8

UnicodeEncodeError:“latin-1”编解码器无法编码字符