Python WebServices
Python作为客户端访问WebService,推荐使用suds来完成
suds官方Document:
https://fedorahosted.org/suds/wiki/Documentation
一、访问WebService
以ALM系统为例:
ALM-getItemsByNamedQuery.py
from suds.client import Client
ssl.wrap_socket = sslwrap(ssl.wrap_socket)
url = 'https://alm.tclcom.com:7003/webservices/10/2/Integrity/?wsdl'
client = Client(url)
print client
itemType = client.factory.create('ns5:NamedQuery')
item_list = ['Project', 'ID', "Summary", 'IPR Value', "Severity", "Priority", "Assigned User", "Created By",
'Attachments', ]
itemType.Username = "******"
itemType.Password = "******"
itemType.InputField = item_list
itemType.QueryName = "shinelite12"
print itemType
resp = client.service.getItemsByNamedQuery(itemType)
print resp
运行时,提示错误:
urllib2.URLError:
resp:查询结果集
二、解析resp
ItemList = {
<ItemList>
element: name="Item"
<StatusResponse>
element: name="return"
attribute: name="transactionId"
}
for Item in resp.Item: #只提取Item信息,忽略< StatusResponse >
Item = {
<Item>
element:name="ItemField", name="Attachment", ref="tns:RelatedItem",
attribute: name="State", name="Type", name="ItemId",
<StatusResponse>
element: name="return"
attribute: name="transactionId"
}
for ItemField in Item.ItemField: #只提取ItemField,忽略Attachment,RelatedItem,< StatusResponse >
<xs:element maxOccurs="unbounded" minOccurs="0" name="ItemField" type="tns:ItemFieldResponse"/>
ItemFieldResponse = {
<ItemFieldBase>
xs:choice element:
shorttext tns:NullableShortString
longtext tns:NullableString
group tns:NullableString
state xs:string
type xs:string
project tns:NullableString
siProject tns:NullableString
double tns:NullableDouble
boolean tns:NullableBoolean
integer tns:NullableInteger
pick {value xs:string }
relatioinship {value xs:string}
date tns:NullableString
dateTime tns:NullableString
UserRecord { user/fullname/email tns:NullableString}
attribute: name="Name"
ItemField[0]: _Name 即InputField字段
ItemField[1]: xs:choice element
从上面分析可知,element 类型种类有xs:string, tns:NullableString, NullableShortString, UserRecord
对type(ItemField[1])类型分析,推测只有三种类型,已经验证过的有
project < type 'instance' >
integer < type 'instance' >
shorttext < type 'instance' >
UserRecord < type 'list' >
state < class 'suds.sax.text.Text'>
dateTime < type 'instance' >
longtext < type 'instance' >
备注:有时候ALM系统更改了字段名,导致resp获取出错
三、源代码
itemsByIDsType = client.factory.create('ns5:GetItemsByIDsType')
print itemsByIDsType
itemsByIDsType.Username = "******"
itemsByIDsType.Password = "******"
itemsByIDsType.ItemId = item_list
# itemsByIDsType.InputField = "R&D or Region Current State Spend Time"
# resp = client.service.getItemsByIDs(itemsByIDsType)
for item_Text in item_list_Text:
itemsByIDsType.InputField = item_Text
resp = client.service.getItemsByIDs(itemsByIDsType)
print resp
item_dict = {}
for item_list_Text_content in item_list_Text:
item_dict[item_list_Text_content] = ""
for item_list_Int_content in item_list_Int:
item_dict[item_list_Int_content] = 0
for item_list_Email_content in item_list_Email:
item_dict[item_list_Email_content] = ""
for item_list_DateTime_content in item_list_DateTime:
item_dict[item_list_DateTime_content] = None
for item_field in item.ItemField:
# print item_field
# Item_field[0] is _Name; Item_field[1] is content
if isinstance(item_field[1], suds.sax.text.Text):
item_value = str(item_field[1])
elif isinstance(item_field[1], list):
if isinstance(item_field[1][0].email, suds.sax.text.Text):
item_value = str(item_field[1][0].email)
else:
item_value = item_field[1][0].email.value
else:
item_value = item_field[1].value
# item_dict[item_field[0]] = item_value
if isinstance(item_value, suds.sax.text.Text):
item_value = item_value.encode("utf-8")
item_dict[item_field[0]] = item_value
# print item_dict
quality = Quality()
quality.Project = item_dict["Project"]
quality.Severity = item_dict["Severity"]
quality.Priority = item_dict["Priority"]
quality.State = item_dict["State"]
quality.Function = item_dict["Function"]
quality.Component = item_dict["Component"]
quality.Country_Area = item_dict["Country/Area"]
quality.Regression = item_dict["Regression"]
quality.Homo = item_dict["Homo"]
quality.RegionCurrentStateSpendTime = item_dict["R&D or Region Current State Spend Time"]
quality.VAL_Refuse = item_dict["VAL Refuse"]
quality.Reporter_Department = item_dict["Reporter Department"]
quality.SW_Release = item_dict["SW Release"]
quality.Operators = item_dict["Operators"]
quality.Perso_ID = item_dict["Perso ID"]
quality.Resolved_By = item_dict["Resolved By"]
quality.Summary = item_dict["Summary"]
quality.All_CEA_Comments = item_dict["All CEA Comments"]
quality.ID = item_dict["ID"]
quality.IPR_Value = item_dict["IPR Value"]
quality.Assigned_User = item_dict["Assigned User"]
quality.Created_By = item_dict["Created By"]
quality.Reported_By = item_dict["Reported By"]
quality.Created_Date = item_dict["Created Date"]
quality.Modified_Date = item_dict["Modified Date"]
quality.VAL_Refuse_Date = item_dict["Val Refused Date"]
quality.Time_To_Set_New = item_dict["Time To Set New"]
quality.Time_To_Set_Assigned = item_dict["Time To Set Assigned"]
quality.Time_To_Set_Open = item_dict["Time To Set Open"]
quality.Time_To_Set_Resolved = item_dict["Time To Set Resolved"]
quality.Time_To_Set_Verified_SW = item_dict["Time To Set Verified_SW"]
quality.Time_To_Set_Delivered = item_dict["Time To Set Delivered"]
quality.Time_To_Set_Verified = item_dict["Time To Set Verified"]
quality.Time_To_Set_Closed = item_dict["Last Time To Set Closed"]
quality.Release = item_dict["Release"]
quality.Verified_By = item_dict["Verified By"]
quality.Original_Brother = item_dict["Original Brother"]
quality.Team = item_dict["Team"]
quality.save()