Saya baru-baru ini tersandung pada masalah yang sama. Inilah sinopsis solusi saya:
Diperlukan blok kode konstituen dasar
Berikut ini adalah blok kode dasar yang diperlukan dari aplikasi klien Anda
- Bagian permintaan sesi: meminta sesi dengan penyedia
- Bagian otentikasi sesi: berikan kredensial ke penyedia
- Bagian Klien: buat Klien
- Bagian Header Keamanan: tambahkan Header WS-Security ke Klien
- Bagian konsumsi: konsumsi operasi (atau metode) yang tersedia sesuai kebutuhan
Modul apa yang Anda butuhkan?
Banyak yang menyarankan untuk menggunakan modul Python seperti urllib2; Namun, tidak ada modul yang berfungsi-setidaknya untuk proyek khusus ini.
Jadi, berikut adalah daftar modul yang perlu Anda dapatkan. Pertama-tama, Anda perlu mengunduh dan menginstal suds versi terbaru dari tautan berikut:
pypi.python.org/pypi/suds-jurko/0.4.1.jurko.2
Selain itu, Anda perlu mengunduh dan menginstal permintaan dan modul suds_requests dari tautan berikut masing-masing (pelepasan tanggung jawab: Saya baru memposting di sini, jadi saya tidak dapat memposting lebih dari satu tautan untuk saat ini).
pypi.python.org/pypi/requests
pypi.python.org/pypi/suds_requests/0.1
Setelah Anda berhasil mengunduh dan menginstal modul ini, Anda siap untuk melanjutkan.
Kode
Mengikuti langkah-langkah yang diuraikan sebelumnya, kode tersebut terlihat seperti berikut ini: Impor:
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
Permintaan sesi dan otentikasi:
username=input('Username:')
password=input('password:')
session = requests.session()
session.auth=(username, password)
Buat Klien:
client = Client(WSDL_URL, faults=False, cachingpolicy=1, location=WSDL_URL, transport=suds_requests.RequestsTransport(session))
Tambahkan 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)
Harap dicatat bahwa metode ini membuat tajuk keamanan yang digambarkan pada Gambar 1. Jadi, penerapan Anda mungkin berbeda-beda bergantung pada format header keamanan yang benar yang disediakan oleh pemilik layanan yang Anda gunakan.
Gunakan metode (atau operasi) yang relevan:
result=client.service.methodName(Inputs)
Logging :
Salah satu praktik terbaik dalam implementasi seperti ini adalah pencatatan untuk melihat bagaimana komunikasi dijalankan. Jika ada masalah, ini membuat debugging menjadi mudah. Kode berikut melakukan logging dasar. Namun, Anda dapat mencatat banyak aspek komunikasi selain yang digambarkan dalam kode.
logging.basicConfig(level=logging.INFO)
logging.getLogger('suds.client').setLevel(logging.DEBUG)
logging.getLogger('suds.transport').setLevel(logging.DEBUG)
Hasil:
Inilah hasil dalam kasus saya. Perhatikan bahwa server mengembalikan HTTP 200. Ini adalah kode sukses standar untuk respons permintaan 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
},
})