python调用hessian

会查到这篇文章的,相信也不需要我介绍hessian了,只是其于python的实现,在官网上太草率了,甚至没有格式化好,以至于下下来的hessianlib.py根本无法用,好吧,我咬牙格式化好,让代码能跑起来,一切好像正常了,可是我需要的是测试通过hessian传递对象参数,以及传递byte[],这有点棘手了。

发现官网上说了那么一句话,关于hessian的python实现,已经转交给mustaine项目来处理,并且给出了google code地址:http://code.google.com/p/mustaine/

我把项目clone下来,可是居然没跑起来,于是从项目主页https://github.com/bgilmore/mustaine里面又下载了一份,安装,测试通过

    url="http://example.com/hession4.0server/remote/helloSpring"
    proxy=HessianProxy(url)
    proxy.setName("zhangsan")#设置属性
    print proxy.sayHello()#调用方法

接下来是测试如何传递类对象和字节数组,一番折腾后,结果如下:

类对象一直没测试通过,会在序列化的时候报错,希望有高手能讲解序列化类对象然后通过hessian传递的方法,这条路走不通的情况下,联系到上篇文章python使用SUDS调用webservice,中我曾经使用了字典传递类对象,于是一测试,居然通过!

addr={"tel":u"电话","fax":"02788889999","code":"ccc","street":"ddd"}
proxy.setAddress(addr)
print proxy.getAddress().fax

好了,不纠结这个了,字节数组我测了无穷多方法,都没通过(没文档害人啊!!!),最后在源码的protocol模块里面找到了一个Binary类,居然通过它就把java端需要的byte[]传递过去了

然后是一个小问题,得到的对象是一个Binary对象,并不具有可读性,简单,取该对象的属性value值即可

user={"name":"walker","password":"ppp","address":[addr],"blob":protocol.Binary("中华人民共和国")}
proxy.setUser(user)
print proxy.getUser().blob.value

需要小注意一下的是address属性,不能直接把addr传进去,而是要包到list里面,同样,取值的时候就要用索引器把它取出来了

顺便演示一下,把一个文件test.jpg通过hessian上传到服务器,再下载回来

    url="http://example.com/hession4.0server/remote/helloSpring"
    proxy=HessianProxy(url)
    st=StringIO.StringIO()
    base64.encode(open("test.jpg","rb"), st)
    user={"name":"walker","password":"ppp","address":[addr],"blob":protocol.Binary(st.getvalue())}
    proxy.setUser(user)
    img=proxy.getUser().blob.value
    base64.decode(StringIO.StringIO(img), open("myjpg.jpg","wb"))
    print "done"
posted @ 2011-07-27 15:34  $walker  阅读(5339)  评论(6编辑  收藏  举报