不廢話直接上代碼
模塊
from xml.etree import ElementTree
from lxml import etree
from xml.parsers.expat import ExpatError
import xml.dom.minidom as Dom
from signxml import XMLSigner
def gen_xml(header_list, body_list):
"""
構建xml文件
:param header_list: head部分 --> list(dict)
:param body_list: body部分 --> list(dict)
:return: xml Document 對象
"""
doc = Dom.Document()
root = doc.createElement('document')
request = doc.createElement('request')
request.setAttribute("id", "request")
head = doc.createElement('head')
for item in header_list: # 生成header 內容
for k, v in item.items():
node = doc.createElement(k)
node.appendChild(doc.createTextNode(str(v)))
head.appendChild(node)
request.appendChild(head)
body = doc.createElement('body')
for v in body_list: # 生成 body 內容
for k, j in v.items():
node = doc.createElement(k)
node.appendChild(doc.createTextNode(str(j)))
body.appendChild(node)
request.appendChild(body)
root.appendChild(request)
# 處理簽名
document_obj = ElementTree.fromstring(str(root.toxml(encoding="utf-8"), "utf-8"))
c14n_algorithm = "http://www.w3.org/TR/2001/REC-xml-c14n-20010315"
signed_xml_obj = XMLSigner(digest_algorithm="sha1", c14n_algorithm=c14n_algorithm).sign(document_obj, key=PRIVATE_KEY) # 核心部分
xml_serialized = etree.tostring(signed_xml_obj) # 序列化
do = parseString(str(xml_serialized, "utf-8")) # 解析字符串 --> Document
signature = doc.createElement('ds:Signature')
signature.setAttribute('xmlns:ds', 'http://www.w3.org/2000/09/xmldsig#')
# 拼接簽名
signedInfo = do.getElementsByTagName("ds:SignedInfo")[0] # 提取加簽後的節點
signatureValue = do.getElementsByTagName("ds:SignatureValue")[0]
signature.appendChild(signedInfo) # 追加 -> Signature
signature.appendChild(signatureValue) # 追加 -> Signature
root.appendChild(signature) # 追加Signature -> document
doc.appendChild(root)
return doc
請求
headers = {"Content-Type": "text/xml; charset=UTF-8", 'Connection': 'close'}
# 客戶端發送請求報文到服務端
xml_data = gen_xml([],[]) # 傳入對應參數
print("請求地址:", request_url)
print("請求報文:", str(xml_data.toxml(encoding="utf-8"), "utf-8"))
response = requests.post(request_url, data=xml_data.toxml(encoding="utf-8"), headers=headers, verify=False)
# 客戶端獲取服務端的響應報文數據
try:
result = parseString(response.text)
print("響應報文:", str(result.toxml(encoding="utf-8"), "utf-8"))
except ExpatError as e:
result = Dom.Document
print(response.status_code, response.text)
如果幫助到您,歡迎點贊!