微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Python:Zeep 始终使用相同的端口向 SOAPUI 服务器发送请求,而不管我的配置

如何解决Python:Zeep 始终使用相同的端口向 SOAPUI 服务器发送请求,而不管我的配置

我试图在 python 中运行 2 个容器。一个是python容器(使用zeep),它向另一个是soapui模拟服务发送消息:

docker run -d --name sav-mock-oc-server                                                       
    -p 8090:8080                                                                             
    -v "***/soapui/:/home/soapui/soapui-prj/" 
    -e MOCK_SERVICE_NAME="12"                                
    -e MOCK_SERVICE_PATH="/12"                                                                  
    -e PROJECT="/home/soapui/soapui-prj/mock-oc-server.xml"                           
    fbascheper/soapui-mockservice-runner:latest

然后,我尝试使用我的服务器的 IP 地址和端口 8090 在我的 SOAPUI 上向模拟服务发送请求,它返回了正确的答案。

但是,当我运行 python 容器发送请求时。我收到以下错误消息:

exception for setTroubleTicketByValue: httpconnectionPool(host='x.x.x.x',port=8080): Max retries exceeded with url: /12 (Caused by NewConnectionError('<urllib3.connection.httpconnection object at 0x7fa814691100>: Failed to establish a new connection: [Errno 111] Connection refused'))

这是我在 docker 中的 SOAPUI 模拟服务的 xml 文件。这部分与我正在运行的具有端点“12”的模拟服务“setTicketByValue”相关:

</soapenv:Envelope>]]></con:responseContent><con:wsaConfig mustUnderstand="NONE" version="200508" action="setTroubleTicketByValue"/></con:response><con:dispatchConfig/></con:mockOperation></con:mockService><con:mockService id="093074c6-453e-41b3-8cff-925167a9cf50" port="8090" path="/12" host="my_adresse" name="12"><con:settings><con:setting id="com.eviware.soapui.impl.wsdl.mock.WsdlMockService@require-soap-action">false</con:setting></con:settings><con:properties/><con:mockOperation name="setTroubleTicketByValue" id="adb75c0d-f0db-40e0-8fc4-b7a613ba491f" interface="JVTTroubleTicketSessionSoapBinding" operation="setTroubleTicketByValue"><con:settings/><con:defaultResponse>Response 1</con:defaultResponse><con:dispatchStyle>SEQUENCE</con:dispatchStyle><con:response name="Response 1" id="9876e9bd-38d7-4a15-8f43-046121674263" httpResponseStatus="200" encoding="UTF-8"><con:settings/><con:responseContent><![CDATA[<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:v1="http://ossj.org/xml/TroubleTicket/v1-2" xmlns:v11="http://ossj.org/xml/TroubleTicket-CBETrouble/v1-2">
   <soapenv:Header/>
   <soapenv:Body>
      <v1:setTroubleTicketByValueResponse>
         <v1:troubleTicketResponse>
            <v11:troubleTicketKey>null</v11:troubleTicketKey>
            <!--Optional:-->
            <v11:returnCode>12</v11:returnCode>
            <!--Optional:-->
            <v11:returnLabel>ERREUR AUTHENTIFICATION</v11:returnLabel>
         </v1:troubleTicketResponse>
      </v1:setTroubleTicketByValueResponse>
   </soapenv:Body>

我检查了整个文件,没有任何服务使用 8080 端口运行。所以我不知道为什么在发送请求时将 8080 作为端口。

这是我在容器中运行以发送请求的 python 代码

from zeep import xsd
from zeep import Client
from zeep.transports import Transport
import requests
from requests.adapters import HTTPAdapter,Retry

session = requests.Session()
retry = Retry(
    total=max_retry,method_whitelist=False
    )
adapter = HTTPAdapter(max_retries=retry)
session.mount('http://',adapter)
session.mount('https://',adapter)
transport = Transport(session=session,timeout=time_out,operation_timeout=time_out)
endpoint = '{}:{}/{}'.format(host,port,path)
logger.info("Endpoint: %s" % endpoint)
client = Client(wsdl=endpoint,transport=transport)
header = xsd.Element(
'{%s:%s/%s}TroubleTicketHeader' % (host,path),xsd.ComplexType([
    xsd.Element('LoginName',xsd.String()),xsd.Element('Password',xsd.String())
])
)
header_value = header(LoginName=login,Password=password)

result = client.service.setTroubleTicketByValue(resyncrequired=True,troubleTicketValue=ticket,_soapheaders[header_value])

我已经检查了我的 docker 的配置,它为模拟服务使用了正确的 IP 地址、端口和端点。

总之,我有两个问题:

  • 主要问题是无论配置如何,zeep 似乎都严格使用端口 8080 发送。如果是这种情况,是否有办法修复它,或者我在代码中做错了什么?
  • 一个问题是 zeep 在我的配置中使用 IP 地址来读取 SOAPUI 的 wsdl。但是在发送请求时,zeep 使用 wsdl 中的主机。这意味着如果我在 xml 文件中放置一个“mypc”并在我的配置中运行模拟服务和正确的 IP 地址。 zeep 将使用地址“mypc”而不是 IP 地址来发送消息,最终由于“未知主机”错误等而失败......但现在这个问题的解决方案很简单,我只是替换所有主机在 xml 文件中使用正确的 IP 地址,它将起作用。但是,如果有人熟悉该主题,我想知道是否有更好的解决方案。

感谢您的帮助。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。