博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python 开发与测试 Webservice(SOAP)
阅读量:4088 次
发布时间:2019-05-25

本文共 5608 字,大约阅读时间需要 18 分钟。

WebService是一种跨编程语言和跨操作系统平台的远程调用技术。

理解WebService

1.从表面上看,WebService就是一个应用程序向外界暴露出一个能通过Web进行调用的API,也就是说能用编程的方法通过Web来调用这个应用程序。我们把调用这个WebService的应用程序叫做客户端,而把提供这个WebService的应用程序叫做服务端。

2.从深层次看,WebService是建立可互操作的分布式应用程序的新平台,是一个平台,是一套标准。它定义了应用程序如何在Web上实现互操作性,你可以用任何你喜欢的语言,在任何你喜欢的平台上写Web service ,只要我们可以通过Web service标准对这些服务进行查询和访问。 

Python 库选择

服务端开发:

针对Python的WebService开发,开发者讨论最多的库是soaplib(官方地址:http://soaplib.github.io/soaplib/2_0/index.html),但从其官网可知,其最新版本“soaplib-2.0.0-beta2”从2011年3月发布后就不再进行更新了。通过阅读soaplib的官方文档,可知其不再维护后已经转向了一个新的项目:rpclib(官方地址:http://github.com/arskom/rpclib)进行后续开发,但在rpclib的readme中,介绍了rpclib已经更名为spyne,并将持续进行更新,so,那就选用spyne进行开发了。

spyne 官方文档:http://spyne.io/docs/2.10/index.html

spyne github:https://github.com/arskom/spyne

  • spyne 安装

1

pip install spyne

  • lxml 安装:

下载与python匹配的版本安装包  https://pypi.python.org/pypi/lxml/3.6.0 进行安装,如  ()

客户端开发:

客户端调用WebService一般应用suds库。

使用参考文档:https://fedorahosted.org/suds/wiki/Documentation

  • suds 安装:

1

pip install suds

Spyne Introduction

Protocols:协议

  Protocols define the rules for transmission of structured data
Transports:传输
  Transports, also protocols themselves, encapsulate protocol data in their free-form data sections.
Models:模式
  Types like Unicode, Integer or ByteArray are all models. They reside in the spyne.model package.
Interface Documents:接口文档
  Interface documents provide a machine-readable description of the expected input and output of the exposed method calls. 
Serializers:序列化对象
  Serializers are currently not distinguished in Spyne code. They are the protocol-specific representations of a serialized Python object.

How your code is wrapped?

step1:Your code is inside @rpc-wrapped methods in ServiceBase subclasses.

step2:The ServiceBase subclasses in turn are wrapped by an Application instance.

         The Application instantiation is used to assign input and output protocols to the exposed methods.

step3:The Application instance is finally wrapped by a client or server transport that takes the responsibility of moving the bits around.

step4:Deploying the service using Soap via Wsgi

服务端代码实例(HelloWorld)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

#!/usr/bin/env python

# -*- coding: utf-8 -*-

 

"""

preference:

    http://spyne.io/docs/2.10/index.html

    https://github.com/arskom/spyne/blob/master/examples/helloworld_soap.py

 

This is a simple HelloWorld example to show the basics of writing

a webservice using spyne, starting a server, and creating a service

client.

Here's how to call it using suds:

 

#>>> from suds.client import Client

#>>> hello_client = Client('http://localhost:8000/?wsdl')

#>>> hello_client.service.say_hello('punk', 5)

(stringArray){

   string[] =

      "Hello, punk",

      "Hello, punk",

      "Hello, punk",

      "Hello, punk",

      "Hello, punk",

 }

#>>>

 

"""

# Application is the glue between one or more service definitions, interface and protocol choices.

from spyne import Application

# @rpc decorator exposes methods as remote procedure calls

# and declares the data types it accepts and returns

from spyne import rpc

# spyne.service.ServiceBase is the base class for all service definitions.

from spyne import ServiceBase

# The names of the needed types for implementing this service should be self-explanatory.

from spyne import Iterable, Integer, Unicode

 

from spyne.protocol.soap import Soap11

# Our server is going to use HTTP as transport, It’s going to wrap the Application instance.

from spyne.server.wsgi import WsgiApplication

 

 

# step1: Defining a Spyne Service

class HelloWorldService(ServiceBase):

    @rpc(Unicode, Integer, _returns=Iterable(Unicode))

    def say_hello(self, name, times):

        """Docstrings for service methods appear as documentation in the wsdl.

        <b>What fun!</b>

        @param name: the name to say hello to

        @param times: the number of times to say hello

        @return  When returning an iterable, you can use any type of python iterable. Here, we chose to use generators.

        """

 

        for i in range(times):

            yield u'Hello, %s' % name

 

 

# step2: Glue the service definition, input and output protocols

soap_app = Application([HelloWorldService], 'spyne.examples.hello.soap',

                       in_protocol=Soap11(validator='lxml'),

                       out_protocol=Soap11())

 

# step3: Wrap the Spyne application with its wsgi wrapper

wsgi_app = WsgiApplication(soap_app)

 

if __name__ == '__main__':

    import logging

 

    from wsgiref.simple_server import make_server

 

    # configure the python logger to show debugging output

    logging.basicConfig(level=logging.DEBUG)

    logging.getLogger('spyne.protocol.xml').setLevel(logging.DEBUG)

 

    logging.info("listening to http://127.0.0.1:8000")

    logging.info("wsdl is at: http://localhost:8000/?wsdl")

 

    # step4:Deploying the service using Soap via Wsgi

    # register the WSGI application as the handler to the wsgi server, and run the http server

    server = make_server('127.0.0.1', 8000, wsgi_app)

    server.serve_forever()

服务端运行后,

访问浏览器检查服务  http://localhost:8000/?wsdl

浏览器中输出wsdl文件:

 

 客户端调用(代码实例)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

#!/usr/bin/env python

# -*- coding: utf-8 -*-

 

from suds.client import Client  # 导入suds.client 模块下的Client类

 

wsdl_url = "http://localhost:8000/?wsdl"

 

 

def say_hello_test(url, name, times):

    client = Client(url)                    # 创建一个webservice接口对象

    client.service.say_hello(name, times)   # 调用这个接口下的getMobileCodeInfo方法,并传入参数

    req = str(client.last_sent())           # 保存请求报文,因为返回的是一个实例,所以要转换成str

    response = str(client.last_received())  # 保存返回报文,返回的也是一个实例

    print req       # 打印请求报文

    print response  # 打印返回报文

 

if __name__ == '__main__':

    say_hello_test(wsdl_url, 'Milton', 2)

客户端运行后,

查看客户端控制台可见输出:

转载地址:http://dcuii.baihongyu.com/

你可能感兴趣的文章
似乎写个ROS功能包并不难,你会订阅话题发布话题,加点逻辑处理,就可以写一些基础的ROS功能包了。
查看>>
if __name__ == ‘__main__‘:就是Python里的main函数,脚本从这里开始执行,如果没有main函数则从上到下顺序执行。
查看>>
PX4官方用户和开发手册的首页面是会给你选择英文和中文的
查看>>
网络协议栈我是不是可以这么理解,就是把你要发送的数据自动处理成TCPIP格式的消息发出去,这种底层的转换不需要你弄了。
查看>>
除了LwIP还有uIP
查看>>
《跟工程师学嵌入式开发》这本书最后的终极项目我反而觉得有说头
查看>>
博士的申请考核制
查看>>
那些硬件的初始化函数主要是在做些上什么?
查看>>
MAVLink学习之路05_MAVLink应用编程接口分析(也有讲STM32下的收发函数)
查看>>
找到了中文版的mavlink手册
查看>>
浅谈飞控开发的仿真功能
查看>>
我觉得在室内弄无人机开发装个防撞机架还是很有必要的,TBUS就做得很好。
查看>>
serial也是见到很多次了,似乎它就是一种串行通信协议
查看>>
TBUS的一些信息
查看>>
PX4+激光雷达在gazebo中仿真实现(古月居)
查看>>
专业和业余的区别就在于你在基础在基本功打磨练习花的时间
查看>>
通过mavlink实现自主航线的过程笔记
查看>>
Ardupilot飞控Mavlink代码学习
查看>>
这些网站有一些嵌入式面试题合集
查看>>
我觉得刷题是有必要的,不然小心实际被问的时候懵逼,我觉得你需要刷个50份面试题。跟考研数学疯狂刷卷子一样!
查看>>