我正在尝试使用 SOAPpy 调用 IBM IMM(集成管理模块)的各种 SOAP 方法。不幸的是,我对 SOAP 相当陌生,根本无法弄清楚。
我没有任何类型的 WSDL,所以我不得不求助于观察我的浏览器在发出各种请求时会做什么。
进行的实际调用如下所示:
POST /wsman HTTP/1.1
Host: 192.168.0.166
Connection: keep-alive
Referer: http://192.168.0.166/
Content-Length: 857
Origin: http://192.168.0.166
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/534.24 (KHTML, like Gecko) Ubuntu/10.10 Chromium/11.0.696.65 Chrome/11.0.696.65 Safari/534.24
Content-Type: text/xml
session_id: 54891711-7ccc-44ce-a903-48a91598b492
Accept: */*
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
Cookie: session_id=none
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:wsman="http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd">
<SOAP-ENV:Header>
<wsa:To>http://192.168.0.166/wsman</wsa:To>
<wsa:ReplyTo>
<wsa:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</wsa:Address>
</wsa:ReplyTo>
<wsman:ResourceURI>http://www.ibm.com/iBMC/sp/Tasks</wsman:ResourceURI>
<wsa:Action>http://www.ibm.com/iBMC/sp/Tasks/GetKVMStatus</wsa:Action>
<wsa:MessageID>dt:1305665818978</wsa:MessageID>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
<GetKVMStatus xmlns="http://www.ibm.com/iBMC/sp/Tasks" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"></GetKVMStatus>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
和响应:
HTTP/1.1 200 OK
Content-Type: application/soap+xml;charset=UTF-8
Content-Length: 884
Date: Tue, 17 May 2011 20:56:13 GMT
Server: lighttpd/1.4.13
<?xml version="1.0"?><s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope"
xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:wxf="http://schemas.xmlsoap.org/ws/2004/09/transfer">
<s:Header>
<wsa:To>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</wsa:To>
<wsa:Action>http://www.ibm.com/iBMC/sp/Tasks/GetKVMStatusResponse</wsa:Action>
<wsa:RelatesTo>dt:1305665818978</wsa:RelatesTo>
<wsa:From><wsa:Address>http://192.168.0.166/wsman</wsa:Address></wsa:From>
<wsa:MessageID>uuid:db591e0e-36dd-459f-9cec-68a19a79318e</wsa:MessageID>
</s:Header>
<s:Body>
<GetKVMStatusResponse>
<ActiveSessions>0</ActiveSessions>
<MaxSessions>4</MaxSessions>
<Encrypted>0</Encrypted>
<HasLicense>1</HasLicense>
<HasPrivilege>1</HasPrivilege>
<DisableHighSpeed>0</DisableHighSpeed>
</GetKVMStatusResponse>
</s:Body>
</s:Envelope>
我正在尝试使用 SOAPpy 正确生成此请求,但我根本没有到达任何地方,我不知道该怎么做或更改才能发出此请求。这是我到目前为止尝试过的:
>>> sess = imm.ImmWeb()
Session ID: 8b3af28d-a746-4fc5-af02-b4560f85cac1
>>> server = SOAPpy.SOAPProxy('http://imm/wsman',namespace='http://www.ibm.com/iBMC/sp/Tasks')
>>> server.transport.cookies['session_id'] = '3f19329f-468b-4c86-b6e7-2197b1ed62aa'
>>> server.invoke('http://www.ibm.com/iBMC/sp/Tasks/GetKVMStatus', {})
*** Outgoing HTTP headers **********************************************
POST /wsman HTTP/1.0
Host: imm
User-agent: SOAPpy 0.12.4 (http://pywebsvcs.sf.net)
Content-type: text/xml; charset=UTF-8
Content-length: 484
SOAPAction: "http://www.ibm.com/iBMC/sp/Tasks/GetKVMStatus"
************************************************************************
*** Outgoing SOAP ******************************************************
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
>
<SOAP-ENV:Body>
<ns1:http://www.ibm.com/iBMC/sp/Tasks/GetKVMStatus xmlns:ns1="http://www.ibm.com/iBMC/sp/Tasks" SOAP-ENC:root="1">
<v1>
</v1>
</ns1:http://www.ibm.com/iBMC/sp/Tasks/GetKVMStatus>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
************************************************************************
«««traceback»»»
SOAPpy.Errors.HTTPError: <HTTPError 400 Bad Request>
使用远程服务器上的 WSDL 文件来指定方法(函数)及其相应的参数和数据类型。
此外,您将有机会确切地知道要建立的 SOAP 连接的命名空间、编码和格式。
尝试使用:
SERVER=SOAPpy.WSDL.Proxy('http://remote.server.url/service.wsdl')
直接使用 SOAPpy.Proxy 将使得有必要将正确的参数添加到您正在与之通信的服务器中。