Gần đây tôi đã vấp phải vấn đề tương tự. Đây là tóm tắt của giải pháp của tôi:
Các khối mã cấu thành cơ bản cần thiết
Sau đây là các khối mã cơ bản bắt buộc của ứng dụng khách của bạn
- Phần yêu cầu phiên: yêu cầu một phiên với nhà cung cấp
- Phần xác thực phiên: cung cấp thông tin đăng nhập cho nhà cung cấp
- Phần Client: tạo Client
- Phần Tiêu đề bảo mật: thêm Tiêu đề WS-Security vào Máy khách
- Phần tiêu thụ: tiêu thụ các hoạt động có sẵn (hoặc phương pháp) khi cần thiết
Những mô-đun nào bạn cần?
Nhiều người đề xuất sử dụng các mô-đun Python như urllib2; tuy nhiên, không có mô-đun nào hoạt động - ít nhất là cho dự án cụ thể này.
Vì vậy, đây là danh sách các mô-đun bạn cần để có được. Trước hết, bạn cần tải xuống và cài đặt phiên bản mới nhất của suds từ liên kết sau:
pypi.python.org/pypi/suds-jurko/0.4.1.jurko.2
Ngoài ra, bạn cần tải xuống và cài đặt các yêu cầu và mô-đun suds numquests từ các liên kết sau tương ứng (từ chối trách nhiệm: Tôi mới đăng bài ở đây, vì vậy hiện tại tôi không thể đăng nhiều hơn một liên kết).
pypi.python.org/pypi/requests
pypi.python.org/pypi/suds_Vquests/0.1
Một khi bạn tải xuống và cài đặt thành công các mô-đun này, bạn sẽ thấy ổn.
Mật mã
Thực hiện theo các bước được nêu trước đó, mã trông như sau: Nhập khẩu:
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
Yêu cầu phiên và xác thực:
username=input('Username:')
password=input('password:')
session = requests.session()
session.auth=(username, password)
Tạo khách hàng:
client = Client(WSDL_URL, faults=False, cachingpolicy=1, location=WSDL_URL, transport=suds_requests.RequestsTransport(session))
Thêm tiêu đề WS-Security:
...
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)
Xin lưu ý rằng phương thức này tạo tiêu đề bảo mật được mô tả trong hình 1. Vì vậy, việc triển khai của bạn có thể thay đổi tùy thuộc vào định dạng tiêu đề bảo mật chính xác được cung cấp bởi chủ sở hữu dịch vụ bạn đang tiêu thụ.
Sử dụng phương pháp liên quan (hoặc hoạt động):
result=client.service.methodName(Inputs)
Ghi nhật ký :
Một trong những thực tiễn tốt nhất trong việc triển khai như thế này là đăng nhập để xem cách truyền thông được thực hiện. Trong trường hợp có một số vấn đề, nó làm cho việc gỡ lỗi dễ dàng. Các mã sau đây không đăng nhập cơ bản. Tuy nhiên, bạn có thể đăng nhập nhiều khía cạnh của giao tiếp ngoài những khía cạnh được mô tả trong mã.
logging.basicConfig(level=logging.INFO)
logging.getLogger('suds.client').setLevel(logging.DEBUG)
logging.getLogger('suds.transport').setLevel(logging.DEBUG)
Kết quả:
Đây là kết quả trong trường hợp của tôi. Lưu ý rằng máy chủ trả về HTTP 200. Đây là mã thành công tiêu chuẩn cho phản hồi yêu cầu 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
},
})