0

我正在使用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,但我没有将此回溯存储到变量中以了解它的状态代码。需要人工干预才能查看状态代码。我的程序如何知道状态码?

4

2 回答 2

1

pysimplesoap源代码中,在client的第261行,编写了用于从客户端发送http请求的send方法

从中得到启示,

def send(self, method, xml):
    ...    
    response, content = self.http.request(
        location, 'POST', body=xml, headers=headers)
    self.response = response
    self.content = content
    ...    

您应该能够访问client.response以获取请求的原始响应。从那里,尝试做 a client.response.status,或做 adir(client.response)找出任何支持的方法来获取状态码。

编辑

如模块中所述,transport可以指定一个库(like urllib2httplib2)。使其成为要拾取的默认值。

于 2014-08-23T07:57:50.897 回答
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模块 loglogging.basicConfig() ,使用日志级别调用并继续使用它。您可以向pysimplesoap.client.log对象添加自定义处理程序,但我不会打扰,真的。如果您看到记录到跟踪中的状态,那么您很可能已经在使用httplib2并且可以更直接地访问状态代码。例如urllib2,也不会记录任何状态。那是因为它是client.response.items()这里记录的值。

于 2014-08-23T08:10:14.537 回答