获取pysimplesoap发送请求的状态码
我正在使用 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
,但是我无法将这个错误追踪信息存储到一个变量中,以便了解它的状态代码。需要人工介入来查看状态代码。我的程序该如何知道这个状态代码呢?
2 个回答
在send
的方法,这个方法是用来从客户端发送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
模块中提到的,你可以指定一个库(比如urllib2
或httplib2
),让它成为默认使用的库。
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
模块的日志,调用 logging.basicConfig()
来设置日志级别,然后继续执行。你可以给 pysimplesoap.client.log
对象添加一个自定义的处理器,但我觉得没必要。如果你在日志中看到了状态信息,那么很可能你已经在使用 httplib2
,可以更直接地访问状态码。比如对于 urllib2
,状态信息也不会被记录。这是因为这里记录的是 client.response.items()
的值。