未找到请求的资源“{spyne.examples.django}”

Requested resource '{spyne.examples.django}' not found

我正在尝试使用 Spyne 在 Django 中开发 soap 服务。我在 Django 应用程序中为应用程序 'Hello_world' 克隆了 spyne,但出现错误。有人可以帮我吗?

我的代码与下面的类似:

app = Application([HelloWorldService], 'spyne.examples.hello.http',
    in_protocol=HttpRpc(),
    out_protocol=Soap11(),
)

但出现以下错误:

<faultcode>soap11env:Client.ResourceNotFound</faultcode>
<faultstring>Requested resource '{spyne.examples.django}' not found</faultstring>
<faultactor/>

您可能还需要使用 in_protocol Soap11。

from spyne.application import Application
app = Application([HelloWorldService], 'spyne.examples.hello.http',
            in_protocol=Soap11(validator='lxml'),
            out_protocol=Soap11(),
        )

您可以查看参考 link

没有为根定义处理程序url:

https://github.com/plq/spyne/blob/b3b3f198b6148a498cdaeda9897307e0c5b1aac1/examples/django/rpctest/urls.py#L40

将输入协议切换为 HttpRpc 并执行此操作后:

curl -D - localhost:8000/hello_world/

你得到:

<?xml version='1.0' encoding='UTF-8'?>
<soap11env:Envelope xmlns:soap11env="http://schemas.xmlsoap.org/soap/envelope/">
<soap11env:Body>
<soap11env:Fault>
    <faultcode>soap11env:Client.ResourceNotFound</faultcode>
    <faultstring>Requested resource u'{spyne.examples.django}' not found</faultstring>
    <faultactor></faultactor>
</soap11env:Fault>
</soap11env:Body></soap11env:Envelope>

那是因为你没有指定调用哪个方法。

该示例中的 HelloWorldService 定义了 say_hello 函数。你可以这样称呼它。

curl -D - "localhost:8000/hello_world/say_hello"

现在这找到了方法,但由于未验证的输入被传递给您的函数,您得到了回溯(我不会在此处包括)。

如果传递所有参数:

curl -D - "localhost:8000/hello_world/say_hello?times=5&name=Fatemeh"

你得到:

    <?xml version='1.0' encoding='UTF-8'?>
    <soap11env:Envelope xmlns:soap11env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tns="spyne.examples.django">
    <soap11env:Body><tns:say_helloResponse>
    <tns:say_helloResult>
        <tns:string>Hello, Fatemeh</tns:string>
        <tns:string>Hello, Fatemeh</tns:string>
        <tns:string>Hello, Fatemeh</tns:string>
        <tns:string>Hello, Fatemeh</tns:string>
        <tns:string>Hello, Fatemeh</tns:string>
    </tns:say_helloResult></tns:say_helloResponse></soap11env:Body></soap11env:Envelope>

您可能希望启用验证以避免 Server 异常。首先我们给输入类型添加Mandatory标记:

    from spyne import M
    class HelloWorldService(Service):
        @rpc(M(Unicode), M(Integer), _returns=Iterable(Unicode))
        def say_hello(ctx, name, times):
            for i in range(times):
                yield 'Hello, %s' % name

然后我们启用软验证(HttpRpc唯一的)

app = Application([HelloWorldService], 'spyne.examples.hello.http',
    in_protocol=HttpRpc(validator='soft'),
    out_protocol=Soap11(),
)

服务器重启后如下:

curl -D - "localhost:8000/hello_world/say_hello"

你得到:

<class 'spyne.model.complex.say_hello'>.name member must occur at least 1 times.

希望对您有所帮助!