ฉันเพิ่งสะดุดกับปัญหาเดียวกันนี้ นี่คือบทสรุปของวิธีแก้ปัญหาของฉัน:
จำเป็นต้องมีบล็อกรหัสองค์ประกอบพื้นฐาน
ต่อไปนี้เป็นบล็อกรหัสพื้นฐานที่จำเป็นสำหรับแอปพลิเคชันไคลเอนต์ของคุณ
- ส่วนคำขอเซสชัน: ขอเซสชันกับผู้ให้บริการ
- ส่วนการรับรองความถูกต้องเซสชัน: ให้ข้อมูลรับรองแก่ผู้ให้บริการ
- ส่วนไคลเอ็นต์: สร้างไคลเอนต์
- ส่วน Security Header: เพิ่ม WS-Security Header ให้กับ Client
- ส่วนการบริโภค: ใช้การดำเนินการที่มีอยู่ (หรือวิธีการ) ตามความจำเป็น
คุณต้องการโมดูลอะไร?
หลายคนแนะนำให้ใช้โมดูล Python เช่น urllib2; อย่างไรก็ตามไม่มีโมดูลใดทำงานได้อย่างน้อยสำหรับโครงการนี้
ดังนั้นนี่คือรายการโมดูลที่คุณต้องได้รับ ก่อนอื่นคุณต้องดาวน์โหลดและติดตั้ง suds เวอร์ชันล่าสุดจากลิงค์ต่อไปนี้:
pypi.python.org/pypi/suds-jurko/0.4.1.jurko.2
นอกจากนี้คุณต้องดาวน์โหลดและติดตั้งคำขอและโมดูล suds_requests จากลิงก์ต่อไปนี้ตามลำดับ (ข้อจำกัดความรับผิดชอบ: ฉันเพิ่งโพสต์ใหม่ที่นี่ดังนั้นฉันจึงไม่สามารถโพสต์มากกว่าหนึ่งลิงก์ได้ในตอนนี้)
pypi.python.org/pypi/requests
pypi.python.org/pypi/suds_requests/0.1
เมื่อคุณดาวน์โหลดและติดตั้งโมดูลเหล่านี้สำเร็จคุณก็พร้อมใช้งาน
รหัส
ทำตามขั้นตอนที่ระบุไว้ก่อนหน้านี้รหัสจะมีลักษณะดังต่อไปนี้:
import logging
from suds.client import Client
from suds.wsse import *
from datetime import timedelta,date,datetime,tzinfo
import requests
from requests.auth import HTTPBasicAuth
import suds_requests
คำขอเซสชันและการรับรองความถูกต้อง:
username=input('Username:')
password=input('password:')
session = requests.session()
session.auth=(username, password)
สร้างลูกค้า:
client = Client(WSDL_URL, faults=False, cachingpolicy=1, location=WSDL_URL, transport=suds_requests.RequestsTransport(session))
เพิ่ม WS-Security Header:
...
addSecurityHeader(client,username,password)
....
def addSecurityHeader(client,username,password):
security=Security()
userNameToken=UsernameToken(username,password)
timeStampToken=Timestamp(validity=600)
security.tokens.append(userNameToken)
security.tokens.append(timeStampToken)
client.set_options(wsse=security)
โปรดทราบว่าวิธีนี้จะสร้างส่วนหัวการรักษาความปลอดภัยที่แสดงในรูปที่ 1 ดังนั้นการใช้งานของคุณอาจแตกต่างกันไปขึ้นอยู่กับรูปแบบส่วนหัวความปลอดภัยที่ถูกต้องที่เจ้าของบริการที่คุณใช้อยู่
ใช้วิธีการที่เกี่ยวข้อง (หรือการดำเนินการ):
result=client.service.methodName(Inputs)
เข้าสู่ระบบ :
หนึ่งในแนวทางปฏิบัติที่ดีที่สุดในการใช้งานเช่นนี้คือการบันทึกเพื่อดูวิธีดำเนินการสื่อสาร ในกรณีที่มีปัญหาบางอย่างจะทำให้การดีบักทำได้ง่าย รหัสต่อไปนี้ทำการบันทึกพื้นฐาน อย่างไรก็ตามคุณสามารถบันทึกการสื่อสารได้หลายแง่มุมนอกเหนือจากที่อธิบายไว้ในโค้ด
logging.basicConfig(level=logging.INFO)
logging.getLogger('suds.client').setLevel(logging.DEBUG)
logging.getLogger('suds.transport').setLevel(logging.DEBUG)
ผลลัพธ์:
นี่คือผลลัพธ์ในกรณีของฉัน โปรดสังเกตว่าเซิร์ฟเวอร์ส่งคืน HTTP 200 นี่คือรหัสความสำเร็จมาตรฐานสำหรับการตอบกลับคำขอ HTTP
(200, (collectionNodeLmp){
timestamp = 2014-12-03 00:00:00-05:00
nodeLmp[] =
(nodeLmp){
pnodeId = 35010357
name = "YADKIN"
mccValue = -0.19
mlcValue = -0.13
price = 36.46
type = "500 KV"
timestamp = 2014-12-03 01:00:00-05:00
errorCodeId = 0
},
(nodeLmp){
pnodeId = 33138769
name = "ZION 1"
mccValue = -0.18
mlcValue = -1.86
price = 34.75
type = "Aggregate"
timestamp = 2014-12-03 01:00:00-05:00
errorCodeId = 0
},
})