使用 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 的相关文章

  • 比较 TCP 校验和与 Scapy?

    我试图在使用 Scapy 作为嗅探器时识别校验和不正确的数据包 我可以通过访问获得原始校验和 packet TCP chksum 然后我使用删除它 del packet TCP chksum 我想做类似的事情 if originalChec
  • 了解 Beautiful Soup 中的 Find() 函数

    我知道我想做的事情很简单 但这让我感到悲伤 我想使用 BeautifulSoup 从 HTML 中提取数据 为此 我需要正确使用 find 功能 这是我正在使用的 HTML div class audit div class profile
  • lxml 中的通配符命名空间

    如何使用 xpath 忽略 xml 命名空间进行查询 我正在使用 python lxml 库 我尝试了以下解决方案this https stackoverflow com questions 13463871 xpath selecting
  • 有没有办法使用 Mayavi 填充陀螺仪表面的一侧?

    我正在使用 Mayavi 绘制陀螺仪的等值面 我的问题是我需要通过填充两个生成区域的一侧来获得更坚固的结构 在下面的图片中 您可以看到我生成的等值面的外观以及填充一侧后的外观 我生成的等值面 它应该是什么样子 等值面可以通过以下方程生成 U
  • 使用 scikit 确定每个特征对特定类别预测的贡献

    我正在使用 scikit 额外的树分类器 model ExtraTreesClassifier n estimators 10000 n jobs 1 random state 0 一旦模型拟合并用于预测类别 我想找出每个特征对特定类别预测
  • 通过pip安装lxml时出错:需要Microsoft Visual C++ 14.0

    我使用的是 Windows 10 机器 最近从 python 2 7 迁移到 3 5 当尝试通过 pip 安装 lxml 时 它会停止并抛出此错误消息 构建 lxml etree 扩展错误 需要 Microsoft Visual C 14
  • PHP 会话中的数据错误

    我对网上商店进行了以下设置 当用户登录时 通过 AJAX 调用脚本 该脚本根据 SOAP Web 服务验证用户数据 并返回用户数据 当用户登录时 用户数据保存在 PHP 会话中 用户数据 仅通过 SOAP 检索 而不由商店存储 我使用默认的
  • pandas 使用查询功能检查列是否为空

    我有 pandas 数据框 我想在它的查询函数上执行 isnull 或 not isnull 条件 如下所示 In 67 df data pd DataFrame a 1 20 None 40 50 In 68 df data Out 68
  • Bokeh 相当于 matplotlib 子图

    我正在寻找一种方法来创建包含多个子图的绘图 例如 fig ax0 ax1 plt subplots nrows 2 sharex True 可以在 matplotlib 中完成 然后可以通过以下方式解决ax0 and ax1 有没有办法在
  • Keras 中的 Tensorflow 自定义损失函数 - 张量循环

    我正在尝试在 Keras 中编写自定义损失函数 如下所示 Keras 中的自定义损失函数 https stackoverflow com questions 43818584 custom loss function in keras 我的
  • 对seaborn图中的分类x轴进行排序

    我正在尝试使用 seaborn 散点图绘制数据框中前 30 的值 如下所示 同一图的可重现代码 import seaborn as sns df sns load dataset iris function to return top 30
  • 向 list.extend() 传递不可迭代对象

    我正在创建一个公共方法来允许调用者将值写入设备 例如将其称为 write vals 由于这些值将实时输入 因此我希望通过允许用户输入列表或单个值来简化用户的生活 具体取决于他们需要写入的值的数量 例如 write to device 1 2
  • Python 2to3 Windows CMD

    我已经安装了 python 32 包到 C python32 我还设置了路径 Python 路径 C Python32 Lib C Python32 DLLs C Python32 Lib lib tk 路径 C Python32 我想使用
  • Flask 无法识别两个 URL 参数

    我正在尝试将两个参数发送到使用 Flask 路由的 URL If I do curl i http 127 0 0 1 5000 api journeys count startStationName Hansard 20Mews 20Sh
  • PyCharm 可以列出项目中的所有 Python 错误吗?

    我在虚拟环境中使用 python 2 7 和 PyCharm 2 7 2013 年 2 月 7 日的新版本 每当我打开其中有明确错误的Python文件 相当于其他语言中的编译错误 例如使用未声明的变量 调用不存在的函数 时 它会在文件的装订
  • matplotlib 轴标签偏移量的因素和变化

    在 matplotlib 中的轴刻度标签上 有两种可能的偏移量 factors and shifts 在右下角 1e 8 是一个 因子 1 441249698e1 是一个 移位 这里有很多答案展示了如何操纵两个都 matplotlib 将轴
  • 返回 OSError 异常类的子类实例的逻辑在哪里?

    我一直在寻找一些对某些人来说可能相对愚蠢的东西 但对我来说非常有趣 输入和输出错误已合并为OSError在 Python 3 3 中 异常类层次结构发生了变化 关于内置类的一个有趣的特性OSError是这样 它在传递时返回它的子类errno
  • 当前异常上下文掩盖了先前的错误

    以下是我在 Doug Hellman 网站上名为 masking exceptions catch py 的文件中找到的示例 我暂时无法找到链接 throws 中引发的异常将被丢弃 而 cleanup 中引发的异常将被报告 道格在他的文章中
  • mpld3图,注释问题

    我正在使用 mpld3 在 Intranet 网站上显示图形 我正在使用将图形保存到字典并使用 mpld3 js 在客户端渲染它的选项 除非我想使用注释 否则该图呈现良好 这些显然是抵消的 我不明白为什么 因为即使我将偏移量设置为 0 0
  • Python 装饰器只是语法糖? [复制]

    这个问题在这里已经有答案了 可能的重复 了解 Python 装饰器 https stackoverflow com questions 739654 understanding python decorators 我对使用 Python 装

随机推荐

  • 谷歌云功能权限问题

    我在 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 文