我使用Pysimplesoap向网络服务发送数据。我想知道请求代码的状态。我可以使用trace=True
打印回溯。它会打印状态代码和其他响应变量,但是如何将所有回溯存储到变量中然后检查状态代码呢?
这是我的代码:_
client = SoapClient(
location = url,
action = 'http://tempuri.org/IService_1_0/',
namespace = "http://tempuri.org/",
soap_ns='soap', ns = False,trace = True
)
data = {'AWB_Number' : '406438762211111', 'Weight':'0.023' ,'Length':'16.4','Height':'4.5','Width':'9.9'}
response= client.UpdateShipment(
ShipmentNumber = data['AWB_Number'],
Weight = Decimal(data['Weight']),
Length = Decimal(data['Length']),
Height = Decimal(data['Height']),
Width = Decimal(data['Width']) ,
InboundLane = "2",
SequenceNumber = "1",
)
我确实得到了追溯: -
Content-length: 526
Content-type: text/xml; charset="UTF-8"
<?xml version="1.0" encoding="UTF-8"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soap:Header/>
<soap:Body>
<UpdateShipment xmlns="http://tempuri.org/">
<SequenceNumber>1</SequenceNumber><Weight>0.023</Weight><Height>4.5</Height><Width>9.9</Width><Length>16.4</Length><ShipmentNumber>406438762211111</ShipmentNumber><InboundLane>2</InboundLane></UpdateShipment>
</soap:Body>
</soap:Envelope>
status: 200
content-length: 293
x-powered-by: ASP.NET
server: Microsoft-IIS/7.5
date: Sat, 23 Aug 2014 07:27:38 GMT
content-type: text/xml; charset=utf-8
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><UpdateShipmentResponse xmlns="http://tempuri.org/"><UpdateShipmentResult/></UpdateShipmentResponse></s:Body></s:Envelope>
===============================================================================
这里提到的状态代码为200
,但是我没有将此回溯存储到变量中以了解它的状态代码。人类需要进行干预以查看状态代码。我的程序如何知道状态代码?
答案 0 :(得分:1)
从pysimplesoap源代码,在客户端的第261行,写入send
method,用于从客户端发送http请求
从中获取提示,
def send(self, method, xml):
...
response, content = self.http.request(
location, 'POST', body=xml, headers=headers)
self.response = response
self.content = content
...
您应该能够访问client.response
以获取请求的原始响应。从那里,尝试执行client.response.status
,或者执行dir(client.response)
以找出获取状态代码的任何支持方法。
修改强>
正如transport
模块中提到的here,您可以指定一个库(like urllib2
或httplib2
)。使它成为默认值。
答案 1 :(得分:1)
SoapClient
实例保留.response
属性,其中包含有关响应的信息。这些信息取决于所选择的运输。
如果您安装了 PySimpleSoap,则会选择urllib2
库并且状态代码不属于client.response
属性;该信息不会从urllib2
的实际响应中保留,只会保留HTTP标头。
pycurl
传输为您提供的信息更少; client.response
总是一个空字典。
只有你还安装了httplib2
,你才能从中得到任何有用的东西;然后将client.response
设置为包含status
代码的字典:
>>> import pysimplesoap
>>> client = pysimplesoap.client.SoapClient(wsdl='http://www.webservicex.net/stockquote.asmx?WSDL')
>>> response = client.GetQuote('GOOG')
>>> client.response
{'status': '200', 'content-length': '991', 'x-aspnet-version': '4.0.30319', 'vary': 'Accept-Encoding', 'server': 'Microsoft-IIS/7.0', '-content-encoding': 'gzip', 'cache-control': 'private, max-age=0', 'date': 'Sat, 23 Aug 2014 08:05:19 GMT', 'x-powered-by': 'ASP.NET', 'content-type': 'text/xml; charset=utf-8'}
>>> client.response['status']
'200'
请注意,该值是字符串,而不是整数。
如果可用,默认情况下会选择httplib2
传输。
至于trace
选项;设置logging
module log,使用日志级别调用logging.basicConfig()
并继续使用它。您可以为pysimplesoap.client.log
对象添加自定义处理程序,但我真的不会打扰。如果您看到状态记录到跟踪,那么很可能您已经使用httplib2
并且可以更直接地访问状态代码。例如,对于urllib2
,也不会记录任何状态。这是因为这里记录了client.response.items()
值。