获取pysimplesoap发送请求的状态码

0 投票
2 回答
2218 浏览
提问于 2025-04-18 18:16

我正在使用 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 个回答

1

的源代码中,客户端的第261行写了一个叫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模块中提到的,你可以指定一个库(比如urllib2httplib2),让它成为默认使用的库。

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 模块的日志,调用 logging.basicConfig() 来设置日志级别,然后继续执行。你可以给 pysimplesoap.client.log 对象添加一个自定义的处理器,但我觉得没必要。如果你在日志中看到了状态信息,那么很可能你已经在使用 httplib2,可以更直接地访问状态码。比如对于 urllib2,状态信息也不会被记录。这是因为这里记录的是 client.response.items() 的值。

撰写回答