使用 Zeep 通过代理访问 SOAP 时更改服务 URL

2024-04-24

在我的应用程序中,我需要访问内部(公司)Soap API。到目前为止,我已经使用 Zeep 进行此访问。但现在访问必须通过代理,并且API的实际地址必须转换为代理的虚拟地址。

创建 Zeep 客户端也可以正常工作,并且我可以访问 WSDL 文件。但是,在调用相应服务时会出现问题,因为 Zeep 从 WSDL 文件中获取相应的 URL,而这与代理的虚拟地址不匹配。

我将尝试用我的具体代码来说明以下问题:

假设 SOAP API 的地址是https://original-soap/wsdl?service=<service_name>.

在代理中有一个映射https://origial-soap to http://virtual-soap.

所以 Zeep 应该使用的地址是http://virtual-soap/wsdl?service=<service_name>.

我按如下方式初始化 Zeep 客户端:

from requests.auth import HTTPBasicAuth
from requests import Session
from zeep import Client
from zeep.transports import Transport
from zeep.helpers import serialize_object

session = Session()
session.proxies = {
    'http': 'http://<proxy_host>:<proxy_port>',
    'https': 'http://<proxy_host>:<proxy_port>',
}
proxy_header = {
    "Proxy-Authorization": "Bearer <proxy_access_token>"
}
session.headers.update(proxy_header)
session.verify = False
session.auth = HTTPBasicAuth(<soap_user>, <soap_password>)
transport = Transport(session=session)

client = Client(wsdl='http://virtual-saop/wsdl?service=<service_name>', transport=transport)

print('CLIENT INITIALIZED') # <-- This print command is executed

soap_result = client.service['<service_function_name>'](<function parameters>) # <-- Connectivity errors occur here

所以我的问题是如何更改 Zeep 在调用服务时使用的 URL,以便此处也使用虚拟地址。

感谢您提前提供任何帮助!

感谢@Bogdan,我使用以下代码进行服务初始化解决了问题:

service = client.create_service(
    client.service._binding.name, client.service._binding_options['address'].replace('https://original-soap:443', 'http://virtual-soap:80', 1)
)

还有另一种方法来创建应该执行此操作的 ServiceProxy。

请参阅以下位置的文档:https://docs.python-zeep.org/en/master/client.html#creating-new-serviceproxy-objects https://docs.python-zeep.org/en/master/client.html#creating-new-serviceproxy-objects

默认的 ServiceProxy 实例是使用 WSDL 中的地址创建的,但是上述创建 ServiceProxy 的方法允许对地址进行更多控制。

的价值{http://my-target-namespace-here}myBinding是您的绑定标识符。如果你做一个python -mzeep https://original-soap/wsdl您应该得到像这样的输出(我在这里使用一些在线示例用于演示目的,因为我无权访问您的 WSDL):

> python -mzeep http://www.dneonline.com/calculator.asmx?WSDL

    
Prefixes:
     xsd: http://www.w3.org/2001/XMLSchema
     ns0: http://tempuri.org/

Global elements:
     ns0:Add(intA: xsd:int, intB: xsd:int)
     ns0:AddResponse(AddResult: xsd:int)
     ns0:Divide(intA: xsd:int, intB: xsd:int)
     ns0:DivideResponse(DivideResult: xsd:int)
     ns0:Multiply(intA: xsd:int, intB: xsd:int)
     ns0:MultiplyResponse(MultiplyResult: xsd:int)
     ns0:Subtract(intA: xsd:int, intB: xsd:int)
     ns0:SubtractResponse(SubtractResult: xsd:int)
     

Global types:
     xsd:anyType
     xsd:ENTITIES
     xsd:ENTITY
     xsd:ID
     xsd:IDREF
     xsd:IDREFS
     xsd:NCName
     xsd:NMTOKEN
     xsd:NMTOKENS
     xsd:NOTATION
     xsd:Name
     xsd:QName
     xsd:anySimpleType
     xsd:anyURI
     xsd:base64Binary
     xsd:boolean
     xsd:byte
     xsd:date
     xsd:dateTime
     xsd:decimal
     xsd:double
     xsd:duration
     xsd:float
     xsd:gDay
     xsd:gMonth
     xsd:gMonthDay
     xsd:gYear
     xsd:gYearMonth
     xsd:hexBinary
     xsd:int
     xsd:integer
     xsd:language
     xsd:long
     xsd:negativeInteger
     xsd:nonNegativeInteger
     xsd:nonPositiveInteger
     xsd:normalizedString
     xsd:positiveInteger
     xsd:short
     xsd:string
     xsd:time
     xsd:token
     xsd:unsignedByte
     xsd:unsignedInt
     xsd:unsignedLong
     xsd:unsignedShort

Bindings:
     Soap11Binding: {http://tempuri.org/}CalculatorSoap
     Soap12Binding: {http://tempuri.org/}CalculatorSoap12

Service: Calculator
     Port: CalculatorSoap (Soap11Binding: {http://tempuri.org/}CalculatorSoap)
         Operations:
            Add(intA: xsd:int, intB: xsd:int) -> AddResult: xsd:int
            Divide(intA: xsd:int, intB: xsd:int) -> DivideResult: xsd:int
            Multiply(intA: xsd:int, intB: xsd:int) -> MultiplyResult: xsd:int
            Subtract(intA: xsd:int, intB: xsd:int) -> SubtractResult: xsd:int

     Port: CalculatorSoap12 (Soap12Binding: {http://tempuri.org/}CalculatorSoap12)
         Operations:
            Add(intA: xsd:int, intB: xsd:int) -> AddResult: xsd:int
            Divide(intA: xsd:int, intB: xsd:int) -> DivideResult: xsd:int
            Multiply(intA: xsd:int, intB: xsd:int) -> MultiplyResult: xsd:int
            Subtract(intA: xsd:int, intB: xsd:int) -> SubtractResult: xsd:int

如果您在 WSDL 上运行命令时查看结果,您将看到“绑定”部分。这就是您获得价值的地方,该价值很可能是Soap11Binding(大多数服务仅提供一种绑定,而本服务提供两种绑定,每个版本对应 SOAP 协议)。

For the http://my-endpoint.com/acceptance/在文档中,您应该替换新的 SOAP 地址(即您现在要发送服务请求的新位置)。从你的例子来看,这应该是http://virtual-soap/something, where something是来自 WSDL 内的原始 SOAP 地址的原始路径(同样,由于我无权访问您的 WSDL,您应该查看地址的哪一部分需要替换,哪一部分保持不变)。

至于你想调用什么操作,那不会改变。你也用同样的方式称呼它。存在相同的方法,因为您不更改服务合同,您只需更改要将请求发送到的位置。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Zeep 通过代理访问 SOAP 时更改服务 URL 的相关文章

  • Python BigQuery 存储。并行读取多个流

    我有以下玩具代码 import pandas as pd from google cloud import bigquery storage v1beta1 import os import google auth os environ G
  • Django REST序列化器:创建对象而不保存

    我已经开始使用 Django REST 框架 我想做的是使用一些 JSON 发布请求 从中创建一个 Django 模型对象 然后使用该对象而不保存它 我的 Django 模型称为 SearchRequest 我所拥有的是 api view
  • 如何在python中读取多个文件中的文本

    我的文件夹中有许多文本文件 大约有 3000 个文件 每个文件中第 193 行是唯一包含重要信息的行 我如何使用 python 将所有这些文件读入 1 个文本文件 os 模块中有一个名为 list dir 的函数 该函数返回给定目录中所有文
  • 更改自动插入 tkinter 小部件的文本颜色

    我有一个文本框小部件 其中插入了三条消息 一条是开始消息 一条是结束消息 一条是在 单位 被摧毁时发出警报的消息 我希望开始和结束消息是黑色的 但被毁坏的消息 参见我在代码中评论的位置 插入小部件时颜色为红色 我不太确定如何去做这件事 我看
  • 安装后 Anaconda 提示损坏

    我刚刚安装张量流GPU创建单独的后环境按照以下指示here https github com antoniosehk keras tensorflow windows installation 但是 安装后当我关闭提示窗口并打开新航站楼弹出
  • 运行多个 scrapy 蜘蛛的正确方法

    我只是尝试使用在同一进程中运行多个蜘蛛新的 scrapy 文档 http doc scrapy org en 1 0 topics practices html但我得到 AttributeError CrawlerProcess objec
  • 从列表中的数据框列中搜索部分字符串匹配 - Pandas - Python

    我有一个清单 things A1 B2 C3 我有一个 pandas 数据框 其中有一列包含用分号分隔的值 某些行将包含与上面列表中的一项的匹配 它不会是完美的匹配 因为它在其中包含字符串的其他部分 该列 例如 该列中的一行可能有 哇 这里
  • 在 NumPy 中获取 ndarray 的索引和值

    我有一个 ndarrayA任意维数N 我想创建一个数组B元组 数组或列表 其中第一个N每个元组中的元素是索引 最后一个元素是该索引的值A 例如 A array 1 2 3 4 5 6 Then B 0 0 1 0 1 2 0 2 3 1 0
  • feedparser 在脚本运行期间失败,但无法在交互式 python 控制台中重现

    当我运行 eclipse 或在 iPython 中运行脚本时 它失败了 ascii codec can t decode byte 0xe2 in position 32 ordinal not in range 128 我不知道为什么 但
  • Python:字符串不会转换为浮点数[重复]

    这个问题在这里已经有答案了 我几个小时前写了这个程序 while True print What would you like me to double line raw input gt if line done break else f
  • 当玩家触摸屏幕一侧时,如何让 pygame 发出警告?

    我使用 pygame 创建了一个游戏 当玩家触摸屏幕一侧时 我想让 pygame 给出类似 你不能触摸屏幕两侧 的错误 我尝试在互联网上搜索 但没有找到任何好的结果 我想过在屏幕外添加一个方块 当玩家触摸该方块时 它会发出警告 但这花了很长
  • 如何将 numpy.matrix 提高到非整数幂?

    The 运算符为numpy matrix不支持非整数幂 gt gt gt m matrix 1 0 0 5 0 5 gt gt gt m 2 5 TypeError exponent must be an integer 我想要的是 oct
  • 在Python中重置生成器对象

    我有一个由多个yield 返回的生成器对象 准备调用该生成器是相当耗时的操作 这就是为什么我想多次重复使用生成器 y FunctionWithYield for x in y print x here must be something t
  • 如何在 Django 中使用并发进程记录到单个文件而不使用独占锁

    给定一个在多个服务器上同时执行的 Django 应用程序 该应用程序如何记录到单个共享日志文件 在网络共享中 而不保持该文件以独占模式永久打开 当您想要利用日志流时 这种情况适用于 Windows Azure 网站上托管的 Django 应
  • 如何从没有结尾的管道中读取 python 中的 stdin

    当管道来自 打开 时 不知道正确的名称 我无法从 python 中的标准输入或管道读取数据 文件 我有作为例子管道测试 py import sys import time k 0 try for line in sys stdin k k
  • glpk.LPX 向后兼容性?

    较新版本的glpk没有LPXapi 旧包需要它 我如何使用旧包 例如COBRA http opencobra sourceforge net openCOBRA Welcome html 与较新版本的glpk 注意COBRA适用于 MATL
  • 如何使用google colab在jupyter笔记本中显示GIF?

    我正在使用 google colab 想嵌入一个 gif 有谁知道如何做到这一点 我正在使用下面的代码 它并没有在笔记本中为 gif 制作动画 我希望笔记本是交互式的 这样人们就可以看到代码的动画效果 而无需运行它 我发现很多方法在 Goo
  • 使用基于正则表达式的部分匹配来选择 Pandas 数据帧的子数据帧

    我有一个 Pandas 数据框 它有两列 一列 进程参数 列 包含字符串 另一列 值 列 包含相应的浮点值 我需要过滤出部分匹配列 过程参数 中的一组键的子数据帧 并提取与这些键匹配的数据帧的两列 df pd DataFrame Proce
  • 协方差矩阵的对角元素不是 1 pandas/numpy

    我有以下数据框 A B 0 1 5 1 2 6 2 3 7 3 4 8 我想计算协方差 a df iloc 0 values b df iloc 1 values 使用 numpy 作为 cov numpy cov a b I get ar
  • Spark.read 在 Databricks 中给出 KrbException

    我正在尝试从 databricks 笔记本连接到 SQL 数据库 以下是我的代码 jdbcDF spark read format com microsoft sqlserver jdbc spark option url jdbc sql

随机推荐

  • 谷歌云功能权限问题

    我在 GCP 中有两个项目 假设项目 A 和 B 项目 A 是新创建的 项目 B 已经有两年了 当我在项目 A 中创建云函数时 它是使用默认服务帐户 project appspot 创建的 但是 当我在项目 B 上创建云函数时 使用了不存在
  • 未找到类型“Track_Attack.TAGeneric”的构造函数。 C# Winforms

    我在 Visual Studio 2010 中收到一条警告消息 标题中的消息 基本上我已经制作了一个通用形式 其中有一堆变量 虚函数 它采用我创建的类作为参数 并将其分配给局部变量 然后使用 getters 和 setters 将其作为属性
  • 允许 PR 构建验证构建而不发布工件

    我正在尝试在我们的主分支上为 PR 设置一些构建验证 我们正在使用 Git 和 VSTS 我添加了一些构建策略来根据已更改的文件启动各种构建 对于某些背景 我们在流程的早期创建 PR 以便我们可以在开发功能分支时跟踪更改并添加评论 现在 我
  • iPhone,拨打另一个电话号码以响应第一个电话号码未接听?

    我正在尝试创建一个应用程序 该应用程序将向类似呼叫中心的列表上的优先级 1 联系人发起呼叫 然后 如果该联系人没有应答 让我们忘记这里应答机的整个问题 我想呼叫优先级 2 联系人 依此类推 直到其中一个联系人应答或我用完我的列表 这可能吗
  • 如何将 CanCanCan 与枚举字段一起使用?

    I got Article具有枚举字段的模型enum status pending done 这是我的能力文件 class Ability include CanCan Ability def initialize user user Us
  • SSLHandshakeException:不存在主题备用名称

    我通过 java 代码调用 HTTPS SOAP Web 服务 我已经在 jre cacerts 密钥库中导入了自签名证书 现在我得到 com sun xml internal ws com client ClientTransportEx
  • asp.net 2.0 全局主题无法在新的 Windows Server 2008 上运行

    我们正在将 net 2 0 网站从带有 IIS6 的 Windows 2003 服务器 32 位 迁移到带有 IIS7 的 Windows Server 2008 64 位 机器 我似乎无法让全球主题发挥作用 与我们的旧服务器相同的内容 目
  • 如何使用 Log4net RolloverFileAppender 在应用程序启动时强制翻转?

    在我们的应用程序中配置 Log4Net 以使用带日期标记的名称和 10Meg 文件大小限制 这会在午夜以及每当达到 10Meg 限制时自动转存到新文件 我还想在每次启动 或关闭 应用程序时将日志记录到一个新文件 我可以获得所有三种翻转行为吗
  • 在 OSX 下将许可证文件附加到 dmg

    伙计们 我可以使用任何命令行将许可证文件附加到 dmg 吗 非常感谢 我在编辑器上遇到了问题 所以如果您在文本中看到 奇怪的事情 请原谅我 我为你找到了一篇博客文章 链接在这里 http thehobbsfamily net archive
  • 无法将应用内购买的托管内容上传到 iTunesConnect

    我正在尝试上传托管内容以进行应用内购买 但到目前为止我尚未成功 我之前使用 Application Loader 为我的应用程序上传了大约 100 个应用程序内购买包 我以前可以毫无问题地上传这些包 现在我注意到最新版本的应用程序加载器 版
  • Python浮点数比较

    我只是回顾了 Python 的一些基础知识 并且有一个关于比较浮点数的棘手问题 2 2 3 0 6 6 3 3 2 0 6 6 I thought these should both return a False However the s
  • XSLT:提取唯一属性值

    请帮忙 我是 XSLT 新手 我正在尝试将一种 XML 格式转换为另一种格式 我需要提取唯一的属性值并将这些值转换为新的格式 下面的示例 XML 显示了原始格式和新 目标格式 我花了很长时间尝试这样做 但没有任何乐趣 有人可以帮忙或给我一些
  • asp.net mvc验证必须是数字自定义错误

    我是 ASP NET 的新手 我遇到了一个问题 当用户在编辑器中为小数字段插入数字以外的内容时 他们会收到错误 字段名称 不是数字 但我不希望他们收到此消息 我希望他们收到另一条消息 对于必需的和范围验证器 我对此没有任何问题 我有什么办法
  • Spring Boot 在 ServerOAuth2AuthorizedClientExchangeFilterFunction 中向 WebClient 请求添加附加属性

    我正在尝试实现 client credentials 授予以在我的 Spring Boot 资源服务器中获取令牌 我在用Auth0作为授权服务器 他们似乎需要在请求正文中添加一个名为 audience 的额外参数 我尝试通过邮递员提出请求并
  • 使用 XSLT 重命名 XML 元素

    我需要更改原始 XML 中的一些元素名称 我正在尝试使用 XSLT 来做到这一点 但无法让它工作 下面是一个 XML 示例 section Jabber section
  • 使用 FileSystemObject write() 写入二进制数据

    我正在使用 FileSystemObject 在 Javascript 中开发一个函数 我只需将我们提供的二进制数据写入文件即可 这是我的职责 function exportFile data var fso f2 fso new Acti
  • 在Android中设置相机对焦区域

    在几个教程和示例之后 我提出了下一个算法来将相机焦点设置在特定点上 问题是相机完全忽略该点并执行正常的整体焦点 而不是我指定的矩形区域 算法中还有什么我遗漏的吗 这已经在多款 Android 4 0 及以上版本的手机上进行了测试 因此这些设
  • Visual Studio 2010 Pro 包括 LightSwitch。如何?

    我看到了 VS2010 Proincludes http social msdn microsoft com Forums en US isvpartneringwithmsft thread 61f54bfa 41ae 4ea1 a871
  • eigen(corr) 中的错误:制作“相关矩阵圆图”时“x”中存在无限值或缺失值

    我想制作一个如下所示的相关矩阵 然而 R一直告诉我 Error in eigen corr infinite or missing values in x 相关矩阵圆 http gallery r enthusiasts com graph
  • 使用 Zeep 通过代理访问 SOAP 时更改服务 URL

    在我的应用程序中 我需要访问内部 公司 Soap API 到目前为止 我已经使用 Zeep 进行此访问 但现在访问必须通过代理 并且API的实际地址必须转换为代理的虚拟地址 创建 Zeep 客户端也可以正常工作 并且我可以访问 WSDL 文