SUDS渲染重复节点并将所有内容包裹其中
这是我的代码:
#Make the SOAP connection
url = "https://api.channeladvisor.com/ChannelAdvisorAPI/v1/InventoryService.asmx?WSDL"
headers = {'Content-Type': 'text/xml; charset=utf-8'}
ca_client_inventory = Client(url, location="https://api.channeladvisor.com/ChannelAdvisorAPI/v1/InventoryService.asmx", headers=headers)
#Make the SOAP headers
login = ca_client_inventory.factory.create('APICredentials')
login.DeveloperKey = 'REMOVED'
login.Password = 'REMOVED'
#Attach the headers
ca_client_inventory.set_options(soapheaders=login)
synch_inventory_item_list = ca_client_inventory.factory.create('SynchInventoryItemList')
synch_inventory_item_list.accountID = "REMOVED"
array_of_inventory_item_submit = ca_client_inventory.factory.create('ArrayOfInventoryItemSubmit')
for product in products:
inventory_item_submit = ca_client_inventory.factory.create('InventoryItemSubmit')
inventory_item_list = get_item_list(product)
inventory_item_submit = [inventory_item_list]
array_of_inventory_item_submit.InventoryItemSubmit.append(inventory_item_submit)
synch_inventory_item_list.itemList = array_of_inventory_item_submit
#Call that service baby!
ca_client_inventory.service.SynchInventoryItemList(synch_inventory_item_list)
这是它输出的结果:
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:ns0="http://api.channeladvisor.com/webservices/" xmlns:ns1="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tns="http://api.channeladvisor.com/webservices/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header>
<tns:APICredentials>
<tns:DeveloperKey>REMOVED</tns:DeveloperKey>
<tns:Password>REMOVED</tns:Password>
</tns:APICredentials>
</SOAP-ENV:Header>
<ns1:Body>
<ns0:SynchInventoryItemList>
<ns0:accountID>
<ns0:accountID>REMOVED</ns0:accountID>
<ns0:itemList>
<ns0:InventoryItemSubmit>
<ns0:Sku>1872</ns0:Sku>
<ns0:Title>The Big Book Of Crazy Quilt Stitches</ns0:Title>
<ns0:Subtitle></ns0:Subtitle>
<ns0:Description>Embellish the seams and patches of crazy quilt projects with over 75 embroidery stitches and floral motifs. You'll use this handy reference book again and again to dress up wall hangings, pillows, sachets, clothing, and other nostalgic creations.</ns0:Description>
<ns0:Weight>4</ns0:Weight>
<ns0:FlagStyle/>
<ns0:IsBlocked xsi:nil="true"/>
<ns0:ISBN></ns0:ISBN>
<ns0:UPC>028906018721</ns0:UPC>
<ns0:EAN></ns0:EAN>
<ns0:QuantityInfo>
<ns0:UpdateType>UnShipped</ns0:UpdateType>
<ns0:Total>0</ns0:Total>
</ns0:QuantityInfo>
<ns0:PriceInfo>
<ns0:Cost>0.575</ns0:Cost>
<ns0:RetailPrice xsi:nil="true"/>
<ns0:StartingPrice xsi:nil="true"/>
<ns0:ReservePrice xsi:nil="true"/>
<ns0:TakeItPrice>6.95</ns0:TakeItPrice>
<ns0:SecondChanceOfferPrice xsi:nil="true"/>
<ns0:StorePrice>6.95</ns0:StorePrice>
</ns0:PriceInfo>
<ns0:ClassificationInfo>
<ns0:Name>Books</ns0:Name>
<ns0:AttributeList>
<ns0:ClassificationAttributeInfo>
<ns0:Name>Designer/Author</ns0:Name>
<ns0:Value>Patricia Eaton</ns0:Value>
</ns0:ClassificationAttributeInfo>
<ns0:ClassificationAttributeInfo>
<ns0:Name>Trim Size</ns0:Name>
<ns0:Value></ns0:Value>
</ns0:ClassificationAttributeInfo>
<ns0:ClassificationAttributeInfo>
<ns0:Name>Binding</ns0:Name>
<ns0:Value>Leaflet</ns0:Value>
</ns0:ClassificationAttributeInfo>
<ns0:ClassificationAttributeInfo>
<ns0:Name>Release Date</ns0:Name>
<ns0:Value>11/1/1999 0:00:00</ns0:Value>
</ns0:ClassificationAttributeInfo>
<ns0:ClassificationAttributeInfo>
<ns0:Name>Skill Level</ns0:Name>
<ns0:Value></ns0:Value>
</ns0:ClassificationAttributeInfo>
<ns0:ClassificationAttributeInfo>
<ns0:Name>Pages</ns0:Name>
<ns0:Value>20</ns0:Value>
</ns0:ClassificationAttributeInfo>
<ns0:ClassificationAttributeInfo>
<ns0:Name>Projects</ns0:Name>
<ns0:Value></ns0:Value>
</ns0:ClassificationAttributeInfo>
</ns0:AttributeList>
</ns0:ClassificationInfo>
<ns0:ImageList>
<ns0:ImageInfoSubmit>
<ns0:PlacementName>ITEMIMAGEURL1</ns0:PlacementName>
<ns0:FilenameOrUrl>1872.jpg</ns0:FilenameOrUrl>
</ns0:ImageInfoSubmit>
</ns0:ImageList>
</ns0:InventoryItemSubmit>
</ns0:itemList>
</ns0:accountID>
</ns0:SynchInventoryItemList>
</ns1:Body>
</SOAP-ENV:Envelope>
你看,它把accountID这个节点创建了两次,还把整个内容都包裹在里面了?这是为什么呢?我该怎么让它不这样做?
补充:我刚刚在SUDS的输出中注意到了这个:
(Content){
tag = "accountID"
value =
(SynchInventoryItemList){
accountID = "REMOVED"
itemList =
(ArrayOfInventoryItemSubmit){
InventoryItemSubmit[] =
(InventoryItemSubmit){
这个标签是什么?...我去查一下文档
3 个回答
0
我也遇到过同样的问题,Philip Haynes 在这个链接上的回答帮了我。Philip Haynes 解释说,问题出在 Document 实例的 method.soap.input.body.wrapped
属性被设置为 True
。这是因为在 wsdl.py
文件中的 Definitions.set_wrapped
方法把这个值设置成了 True,但实际上不应该这样。
你可以试试把客户端的 unwrap
选项设置为 False
,
my_client = Client(url, unwrap=False)
0
这可能是WSDL的问题,或者是SUDS的一个bug。你有没有对比一下WSDL的内容和SUDS展示的SOAP信封的内容?
0
答案就在我代码的最后一行,我需要这样做:
ca_client_inventory.service.SynchInventoryItemList(accountID, array_of_inventory_item_submit)
这里的accountID是一个变量,用来存储账户的ID字符串。
我在#suds的IRC聊天群里,听jortel说过:“suds提供了一种RPC接口,可以让用户不必直接接触SOAP消息的格式。”而调用中的新参数也是他提供的。希望这能帮到某些人。