zsi + wsdl + mod_python


/*!
zsi + wsdl + mod_python
created by : andrew.wu ([email protected])
created on : 2009/05/28
url        : http://blog.oolanguage.com/erpingwu/zsi-wsdl-mod_python/*/


ZSI(The Zolera SOAP Infrastructure) 似乎很多人用,但文档与代码例子都有问题,开源的东西也就不苟求。
所用源码从 https://pywebsvcs.svn.sourceforge.net/svnroot/pywebsvcs/trunk 下载,revision: 1493

首先观察代码
pywebsvcs/trunk/zsi/doc/examples/server/receive_request/simple/mod_python/MyHandler.py

from Example_services import EchoResponseWrapper
 
def echo(message):
    response = EchoResponseWrapper()
    response._Message = message
    return response


看起来感觉很好,但等你用 wsdl2py 处理 wsdl 文件后会愕然发现其中的 EchoResponseWrapper 根本不知道从何而来 。

下面一步步来进行,首选是对 pywebsvcs/trunk/zsi/doc/examples/server/receive_request/simple/binding.wsdl 稍作修改

  <service name="ExampleService">
    <documentation>Example web service</documentation>
    <port name="Example" binding="tns:Binding">
      <soap:address location="http://localhost/zsi/ws.py"/>
    </port>
  </service>


然后用 python wsdl2py -b binding.wsdl 生成辅助文件

下面是经测试后可行的相关配置及服务,客户端的具体代码

D:/xampp170/apache/conf/extra/httpd-vhosts.conf

<Directory D:/xampp170/htdocs/zsi>
    AddHandler mod_python .py
    PythonHandler ws
    PythonDebug On
</Directory>



D:/xampp170/htdocs/zsi/ws.py

from ZSI import dispatch
from mod_python import apache
 
import mh
mod = __import__('encodings.utf_8', globals(), locals(), '*')
mod = __import__('encodings.utf_16_be', globals(), locals(), '*')
 
def handler(req):
    dispatch.AsHandler(modules=(mh,), request=req)
10      return apache.OK



D:/xampp170/htdocs/zsi/mh.py

import os
from Example_services import *
from mod_python import apache
import pickle
 
def echo(kw):
    response = EchoResponse()
    response._Message = kw;
    return response


使用 ZSI 为客户端

import sys,time
from ZSI.client import NamedParamBinding as NPBinding
 
b = NPBinding(url='http://localhost/zsi/ws.py', tracefile=sys.stdout)
print "Echo: ", b.echo(p1 = "zsi client")


使用 soappy 为客户端

def OpenSoapProxy(uri):
    from SOAPpy import WSDL
    proxy = WSDL.Proxy(uri)
    proxy.soapproxy.config.buildWithNamespacePrefix = 0
    for i in proxy.methods:
        proxy.methods[i].namespace = proxy.wsdl.targetNamespace
    return proxy
proxy = OpenSoapProxy("http://localhost/zsi/binding.wsdl")
print proxy.echo(p1 = "soappy client")


使用 PHP 为客户端

<?php
$client = new SoapClient("http://localhost/zsi/binding.wsdl?echo");
//var_dump($client->__getFunctions());
//var_dump($client->__getTypes());
$ret = $client->echo("php client");
var_dump($ret)
?>
 

你可能感兴趣的:(python,service,url,SOAP,import,binding)