8-3<X12>soap.xml SOAP web 服务

  1. Para 2:但解开这层面纱,SOAP 库实际上扮演了一个多 XML 文档和远程服务器参与的复杂处理过程。
    (./)揭开这层面纱,SOAP 库实际上执行了一个多 XML 文档和远程服务器参与的复杂处理过程。

  2. Para 3Some people would pipe up to add that SOAP allows for one-way asynchronous message passing, and document-oriented web services.
    有些人觉得应该补充上:SOAP 还允许单向异步的信息通过,并且是面向文档的 Web 服务。
    (./) 有些人觉得应该补充上:SOAP 还允许单向异步的信息通过,以及面向文档的 Web 服务。

12.1 概览

  1. Para 1:你是否曾经 {X} 希望能以程序化的方式访问 Google 的搜索结果呢?

  2. 进一步阅读The SOAP specification is surprisingly readable, if you like that sort of thing.
    SOAP 说明书对于 SOAP 相关的问题讨论非常易读
    (./) SOAP 规范相当可读,如果你喜欢这类东西的话

12.2 安装 SOAP 库

  1. 希望检验 XXX 安装是否正确,……
    (./) 检验 XXX 安装是否正确

  2. Para 3:你 {X} 要用到的第一个库是 PyXML, {i} 是 XML 库的一个高级组件,这个库 {X} 提供了比我们在 第 9 章 学习的 XML 内建库更多的功能。

  3. 12.2.2, Para 1:你所需要安装的第二个库是 fpconst,使 <!> 一系列支持 IEEE754 double-precision 特殊值的常量和函数,…… (./) 它是

12.3 步入 SOAP

  1. 例12.6, (1):你通过 SOAPProxy 这个 {i} 代理 (proxy) 类访问远程 SOAP 服务器。

  2. 例12.6, (2):每个 SOAP 服务都有一个命名空间(namespace),这个命名空间是由服务器任意命名的。这不过是为了调用 SOAP 方法而设置的。它使得服务器为多个不相关的服务提供服务 URL 和路径请求共享成为可能。这与 Python 中模块到 packages 的关系类似。
    (./) 每个 SOAP 服务都有一个命名空间(namespace),这个命名空间是由服务器任意命名的。这不过是为调用 SOAP 方法设置的。它使得服务器让多个不相关的服务共享服务 URL 和路径请求成为可能。这与 Python 中模块相对于包的关系类似。

  3. 例12.6, (3)You're creating the SOAPProxy with the service URL and the service namespace. This doesn't make any connection to the SOAP server; it simply creates a local Python object.
    这里你创建了包含服务 URL 和服务命名空间的 SOAPProxy。这与 SOAP 服务器无关;仅仅是建立了一个本地 Python 对象。
    (./) 这里你创建了包含服务 URL 和服务命名空间的 SOAPProxy。此时还不会连接到 SOAP 服务器;仅仅是建立了一个本地 Python 对象。

  4. 例12.6, (4):到此为止,如果你的设置完全正确,应该可以向调用本地函数一样调用远程 SOAP 方法。给普通函数传递参数并接收返回一样,但在这背后却隐藏着很多的工作。
    (./) 这和给普通函数传递参数并接收返回值一样,但在背后却隐藏着很多的工作。

12.4 SOAP 网络服务查错

  1. 显性数据类型”改为“显式数据类型”。

  2. “(Python) 原始数据类型”改为“本地数据类型”。

  3. 例12.7, (1):首先,正常建立带有服务 URL 和命名空间的 SOAPProxy。
    (./) 首先,和平常一样,建立带有服务 URL 和命名空间的 SOAPProxy。

  4. 例12.7, (3):最后,正常调用远程 SOAP 方法。
    (./) 最后,和平常一样,调用远程 SOAP 方法。

  5. 例12.7b, (1):这个元素名 getTemp 就是函数名。SOAPProxy 把 getattr 当作一个发报机有别使用方法名分别调用本地方法,这里使用方法名构造了一个 XML 请求文档。
    (./) 这个元素名 getTemp 就是函数名。SOAPProxy 使用 getattr 作为分发器有别于使用方法名分别调用本地方法,这里使用方法名构造了一个 XML 请求文档。

12.5 WSDL 介绍

  1. Para 1:它没有做到的是提供任何 {X} 方法自省的手段。

  2. Para 2试想一下:前面两部分所展现的调用只有一个参数和返回的简单远程 SOAP 方法。
    (!) 这不是假设。
    (./) 考虑一下:……

  3. Para 3:Python 精妙地 {X} 不需要明示类型,……

  4. Para 4:WSDL 是“网络服务描述语言(Web Services Description Language)”的缩写。 {i} 尽管是为自如地表述多种类型的网络服务而设定,却也经常用于描述 SOAP 网络服务。

  5. Para -6The type of web service (probably function calls using SOAP, although as I mentioned, WSDL is flexible enough to describe a wide variety of web services)
    网络服务的类型(可能还包括 SOAP 的函数调用,正像我所说过的,WSDL 足够自如地去描述网络服务的广泛内容)
    (./) 网络服务的类型(可能 SOAP 的函数调用,但我说过,WSDL 足够自如地去描述网络服务的广泛内容)

12.6 以 WSDL 进行SOAP 内省

  1. 例12.8, (2)To use a WSDL file, you again use a proxy class, WSDL.Proxy, which takes a single argument: the WSDL file. Note that in this case you are passing in the URL of a WSDL file stored on the remote server, but the proxy class works just as well with a local copy of the WSDL file.
    使用一个 WSDL 文件,你还是要用到一个 proxy 类:WSDL.Proxy,它只需一个参数:WSDL 文件。我所说的是把存储在远程服务器上的 WSDL 的 URL,但是这个 proxy 类对于本地的 WSDL 副本工作同样出色。
    (./) 使用一个 WSDL 文件,你还是要用到一个 proxy 类:WSDL.Proxy,它只需一个参数:WSDL 文件。我指定的是存储在远程服务器上的 WSDL 的 URL,但是这个 proxy 类对于本地的 WSDL 副本工作同样出色。

  2. 例12.8, (3):WSDL proxy 类以 Python 字典 server.methods 的方式揭示有效函数。所以列表有效方法就像调用字典方法 keys() 一样简单
    (./) WSDL proxy 类通过 Python 字典 server.methods 揭示有效函数。所以列出有效方法只需调用字典方法 keys()

  3. 例12.9, (3):在通过 SOAP 调用函数时,你不需要知道参数名,但 SOAP 支持在调用函数时使用参数名的情形 {X} (类似于 Python )。

  4. 例12.9, (4)Each parameter is also explicitly typed, using datatypes defined in XML Schema.
    每个参数都是都是显性类型的,在 XML Schema 中以数据类型定义
    (./) 每个参数都是都是显式类型的,使用的是在 XML Schema 定义的数据类型

  5. 例12.11, (1){i} 比直接调用 SOAP 服务时的设置简单,因为在 WSDL 文件中包含着调用服务所需要的服务 URL 和命名空间。

12.7 搜索 Google

  1. 过程12.4, 2.:还是在 http://www.google.com/apis/ 上,下载 Google 网络 APIs 开发工具包( {i} Google Web APIs developer kit)

  2. 例12.13上
    lr ( {i}language restrict”,语言限制) ie 和 oe ( {i}input encoding”,输入编码和 “output encoding”,输出编码)

  3. 例12.13, (1):……记住 {X} 要使用你注册 Google 网络服务时授权给你自己的 Google API 许可证。

  4. 例12.14, (2)In total, there were approximately 30 million results. You can access them 10 at a time by changing the start parameter and calling server.doGoogleSearch again.
    总共有接近30,000,000个结果信息,你可以通过以 10 递增地改变 start 参数来重复调用 server.doGoogleSearch 。
    (./) 总共有接近 30,000,000 个结果信息。通过让 start 参数以 10 递增来重复调用 server.doGoogleSearch,你能够获得全部的结果。

12.8 SOAP 网络服务故障排除

  1. Para 2:正如你在本章中看到的,SOAP 牵扯了很多层面。需要 HTTP 层,SOAP 需要向 HTTP 服务器发送 XML 文档并接收返回的 XML 文档。这样一来,你在 第 11 章 HTTP Web 服务 学到的差错技术在这里都有了用武之地。
    (./) 正如你在本章中看到的,SOAP 牵扯了很多层面。SOAP 向 HTTP 服务器发送 XML 文档并接收返回的 XML 文档时需要用到 HTTP 层。这样一来,你在 第 11 章 HTTP Web 服务 学到的调试技术在这里都有了用武之地。

  2. 例12.15, (2)The server responds by sending a SOAP Fault, which SOAPpy turns into a Python exception of type SOAPpy.Types.faultType. All errors returned from any SOAP server will always be SOAP Faults, so you can easily catch this exception. In this case, the human-readable part of the SOAP Fault gives a clue to the problem: the method element is not namespaced, because the original SOAPProxy object was not configured with a service namespace.
    服务器返回的是一个 SOAP 错误,SOAPpy 溢出了SOAPpy.Types.faultType 这个 Python 异常。从任何 SOAP 服务器返回的错误都是 SOAP 错误,因此你可以轻易地捕获这个异常。就此而言,我们能从 SOAP 错误信息中看出端倪:由于源 SOAPProxy 对象没有设置服务命名空间,因此方法元素也就没有了命名空间。
    (./) 服务器返回的是一个 SOAP 错误 (Fault),SOAPpy 把它转换为 Python 异常 SOAPpy.Types.faultType。从任何 SOAP 服务器返回的错误都是 SOAP 错误,因此你可以轻易地捕获这个异常。就此而言,我们能从 SOAP 错误信息中看出端倪:由于源 SOAPProxy 对象没有设置服务命名空间,因此方法元素也就没有了命名空间。

  3. 例12.16上Misconfiguring the basic elements of the SOAP service is one of the problems that WSDL aims to solve.
    错误配置 SOAP 服务的基本元素是 WSDL 问题解决的着眼点
    (./) 错误配置 SOAP 服务的基本元素是 WSDL 着眼解决的问题

  4. 例12.16, (1):……WSDL.Proxy 不会为你强制 {i} 转换数据类型;……

  5. 例12.18上What about Google's web service? The most common problem I've had with it is that I forget to set the application key properly.
    那么 Google 网络服务方面又如何呢?最常见的错误是我曾经犯过的忘记正确设置应用许可证错误。
    (./) 我曾经犯过的最常见的错误是忘记正确设置应用许可证。

  6. 例12.18Calling a Method With An Application-Specific Error
    调用方法返回一个应用指定错误
    (./) 调用方法返回一个应用特定的错误

  7. 例12.18, (1)The problem is application-specific: the first argument is supposed to be my application key,...
    问题在于应用指定:第一个参数应该是我的应用许可证,……
    (./) 这个问题是应用特定的:第一个参数应该是我的应用许可证,……

  8. 例12.18, (2)Google 服务器返回的是一个 SOAP 错误和一大串特别长的错误信息,其中包含了完整的 Java 堆栈跟踪。记住所有的 SOAP 错误都被标示为 SOAP 错误:设置错误,函数参数错误以及应用指定错误等等。在其中埋藏的至关重要信息确是非有效授权许可证:foo(Invalid authorization key: foo)
    (./) Google 服务器返回的是一个 SOAP 错误和一大串特别长的错误信息,其中包含了完整的 Java 堆栈跟踪。记住所有的 SOAP 错误都被标示为 SOAP Faults: errors in configuration (设置错误), errors in function arguments (函数参数错误),或者是应用特定的错误 (这里就是) 等等。在其中埋藏的至关重要信息Invalid authorization key: foo(非有效授权许可证:foo)

12.9 小结

DiveIntoPythonZh/2007-08-03 (last edited 2009-12-25 07:09:17 by localhost)