获取使用pysimplesoap发送的请求的状态代码

时间:2014-08-23 07:30:00

标签: python 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 个答案:

答案 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 urllib2httplib2)。使它成为默认值。

答案 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()值。