Lập trình với XML cho DB2, Phần 4: Tích hợp dữ liệu từ các nguồn dữ liệu khác nhau trong ứng dụng DB2 dựa trên web của bạn

Bài viết này cung cấp một ví dụ trình điều khiển SOAP cho DB2 có thể được sử dụng để ngầm

chạy thi hành thủ tục lưu sẵn của DB2 bằng cách sử dụng các API SOAP mà không cần phải tạo

ra bất kỳ ánh xạ tường minh nào. Tôi tin rằng các trình điều khiển cơ sở dữ liệu thế hệ tiếp theo

sẽ dịch chuyển việc kết nối cơ sở dữ liệu từ các API mức thấp như ODBC/JDBC sang các API

mức cao như SOAP và REST, dẫn đến việc cơ sở dữ liệu đóng vai trò trực tiếp trong thế giới

SOA.

Để chỉ làm nổi bật những khía cạnh quan trọng của kiến trúc liên quan đến các mô hình dữ liệu

XML, luồng xử lý được cố tình giữ ở mức đơn giản. Các giao diện đồ họa người dùng cũng được

giữ ở mức tối thiểu cần thiết để hiển thị các chức năng.

Các lược đồ XML của Liên minh du lịch mở được sử dụng để tạo ra dữ liệu khách sạn mẫu cũng

như cuộc gọi SOAP để tìm kiếm khách sạn. API PayPal được sử dụng để thực hiện các giao dịch

bằng thẻ tín dụng từ máy chủ ứng dụng.

pdf13 trang | Chuyên mục: XML | Chia sẻ: dkS00TYs | Ngày: 17/10/2014 | Lượt xem: 1164 | Lượt tải: 3download
Tóm tắt nội dung Lập trình với XML cho DB2, Phần 4: Tích hợp dữ liệu từ các nguồn dữ liệu khác nhau trong ứng dụng DB2 dựa trên web của bạn, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
hiều trường hợp nó làm 
giảm vai trò của các máy chủ ứng dụng xuống là vai trò của cảnh sát giao thông. 
Trình khách gọi hàm getRatescallback khi nó nhận được đáp ứng từ máy chủ ứng dụng. Đáp ứng 
SOAP đã trả về được phân tích cú pháp bằng cách sử dụng trình phân tích DOM. Trình phân tích 
DOM được đặt cấu hình để xử lý các không gian tên trong đáp ứng SOAP. 
Liệt kê 11. Máy khách phân tích cú pháp đáp ứng SOAP từ máy chủ ứng dụng 
soapxml= new xmlparse(xmlhttp.responseXML, false); 
soapxml.xmlRoot.setProperty("SelectionNamespaces", 
"xmlns:xsl=' 
xmlns:SOAP-ENV=' 
xmlns:db='"); 
var hstr='<table cellSpacing="0" width="100%" cellPadding="2" border="1" 
align="left">'; 
hstr+="nameraterooms"; 
Mỗi hàng trong tập kết quả từ cơ sở dữ liệu được chiết xuất vào một cây DOM khác, sau đó được 
điều hướng bằng cách sử dụng XPath để trích xuất các thông tin liên quan. Một khung nhìn mới 
được tạo ra cho trình khách, khung nhìn này cho thấy danh sách tất cả các khách sạn đã được trả 
về. Xin lưu ý việc sử dụng bí danh không gian tên trong các cuộc gọi XPath. 
Liệt kê 12. Máy khách trích xuất tập kết quả từ cơ sở dữ liệu từ phần thân của SOAP 
soapxml.find("//SOAP-ENV:Body//db:row",null,true); 
for(i=0;soapxml.currentFind.length>i;i++) 
{ 
var result=soapxml.getValue("db:col/text()",i); 
rateslist=new xmlparse(result,true); 
rateslist.xmlRoot.setProperty("SelectionNamespaces", 
"xmlns:xsl=' 
xmlns:x=' "); 
 var id=rateslist.getValue("//x:HotelDescriptiveContents/@HotelCode",null); 
 var name=rateslist.getValue("//x:HotelName/@HotelShortName",null); 
 var rooms=rateslist.getValue("//x:GuestRoomInfo/@Quantity",null); 
 var charge=rateslist.getValue("//x:Charge/@Amount",null); 
hstr+=""+name+""+charge+""+rooms+" 
<input type='button' onClick=\"javascript:bookRoom('"+id+"','"+charge+"'); 
 \" value='select'/>"; 
} 
document.getElementById("canvas").innerHTML=hstr; 
Bước 3 
Trong bước cuối cùng này khách hàng sẽ chọn một khách sạn và đặt một phòng trong khách sạn 
đó. Các thông tin về thẻ tín dụng được lấy từ hồ sơ khách hàng đã lưu trong cơ sở dữ liệu. 
Hình 7. Luồng lệnh và dữ liệu để đặt phòng 
Bây giờ khách hàng có thể chọn khách sạn trong danh sách để đặt phòng tại khách sạn đó. 
Hình 8. Đặt phòng trong danh sách khách sạn 
Khi khách hàng nhấn nút Select, hàm bookroom trong Javascript phía khách được gọi. Một 
thông điệp XML với yêu cầu đặt phòng sẽ được gửi đến máy chủ ứng dụng như là một yêu cầu 
POST bằng cách sử dụng các API AJAX. Yêu cầu này cũng có ID của khách sạn, tên khách 
hàng, số phòng muốn đặt, và số tiền sẽ tính vào thẻ tín dụng của khách hàng. 
Liệt kê 13. Máy khách gọi máy chủ ứng dụng với cuộc gọi REST để đặt phòng 
function bookRoom(hotelid,amount) 
{ 
var cid=document.getElementById("userid").value; 
var msg='<ccinfo units="1" invoice="" 
amount="'+amount+'"/>'+cid+' 
'+hotelid+''; 
var xmlhttpObj= new XMLHttpRequest(); 
xmlhttpObj.open('POST', servletpath, true); 
xmlhttpObj.onreadystatechange = function() { bookRoomcallback(xmlhttpObj); }; 
xmlhttpObj.setRequestHeader('content-type', 'text/xml'); 
xmlhttpObj.send(msg); 
} 
Máy chủ ứng dụng phân tích cú pháp thông điệp đến và chiết xuất ID của khách hàng từ thông 
điệp đó. Sau đó, nó gọi cơ sở dữ liệu nội bộ để có thông tin về hồ sơ khách hàng và thẻ tín dụng 
từ bảng khách hàng. 
Ghi chú: Thông tin về thẻ tín dụng được lưu trữ trong một cột đã mật mã hóa trong bảng khách 
hàng. Mặc dù mật khẩu trong đoạn mã lệnh ví dụ là mã cứng (hardcode), trong kịch bản thế giới 
thực, nhiều khả năng nó sẽ là mật khẩu được khách hàng sử dụng để đăng nhập. 
Liệt kê 14. Máy chủ ứng dụng truy vấn thông tin về thẻ tín dụng đã mật mã hóa từ cơ sở 
dữ liệu 
XMLParse msgxml=new XMLParse(msg); 
String userid=msgxml.getValue("//username/text()"); 
Connection conn= DriverManager.getConnection("jdbc:db2:article4"); 
Statement stmt = conn.createStatement(); 
stmt.setMaxRows(1); 
ResultSet rs= stmt.executeQuery("select info, 
decrypt_char(CC,'password') from customers where custid='"+userid+"'"); 
if(rs.next ()) 
{ 
String custinfo=rs.getString(1); 
String CCInfo=rs.getString(2); 
 Tiếp theo, máy chủ ứng dụng tạo cuộc gọi SOAP đến thủ tục lưu sẵn bookaroom trong cơ sở dữ 
liệu article4 chạy phía sau bức tường lửa của phòng ban nội bộ. ID của khách sạn và các thông 
tin về hồ sơ của khách hàng được chuyển như một đối số đến thủ tục lưu sẵn. 
Liệt kê 15. Máy chủ ứng dụng thực hiện cuộc gọi SOAP đến thủ tục lưu sẵn bookaroom 
String hotelid=msgxml.getValue("//hotelid/text()"); 
String body=""+ 
""+hotelid+""+ 
""+custinfo+""+ 
""+ 
""; 
String soapstr=sendURLMessage("", 
body,""); 
Thủ tục lưu sẵn bookaroom chỉ là một thủ tục giả luôn luôn trả về giá trị hoá đơn cố định trong 
đối số đầu ra của thủ tục lưu sẵn. Nó nhằm mục đích cho thấy db2soapdriver xử lý đối số đầu ra 
và biểu diễn chúng trong đáp ứng SOAP. 
Ghi chú: Nếu đó là một thủ tục lưu sẵn đang làm việc, thực sự đặt phòng, thì nó cũng sẽ yêu cầu 
các thông tin như ngày tháng nhập phòng và loại phòng để xử lý các giao dịch. Đây là một bài 
tập, bạn có thể mở rộng các kịch bản bằng cách tăng cường mã phía trình khách để chấp nhận 
các thông tin vể ngày tháng nhập phòng và loại phòng cũng như tạo ra thông điệp về đặt phòng 
tại OTA. Bạn cũng cần thêm một bảng khác để xử lý thông tin đặt phòng. 
Liệt kê 16. Máy chủ ứng dụng thực hiện cuộc gọi SOAP đến thủ tục lưu sẵn bookaroom 
create procedure bookaroom (in hotelid varchar(12), in userinfo xml, 
 out invoice varchar(64)) 
language SQL 
begin 
set invoice = 'INV001'; 
return 1; 
end 
Chuỗi trả lời SOAP được phân tích cú pháp như là một đối tượng DOM bằng cách sử dụng lớp 
bao bọc XML, và số hoá đơn được chiết xuất bằng cách sử dụng cuộc gọi XPath. Xem tệp 
db2soapdriver.java để hiểu lược đồ trả lời SOAP sinh ra từ một cuộc gọi đến thủ tục lưu sẵn của 
DB2. 
Liệt kê 17. Máy chủ ứng dụng chiết xuất số hóa đơn từ trả lời SOAP 
XMLParse soapXML= new XMLParse(true); 
soapXML.createDOM(soapstr,false); 
String namespaces= "SOAPENV= 
db2="; 
soapXML.setNamespaces(namespaces,"="); 
String invoice=soapXML.getValue("//db2:out/text()",null); 
Giá trị hóa đơn được thiết lập trong thông điệp của trình khách và được chuyển cho hàm giao 
dịch thẻ tín dụng. Kết quả của giao dịch thẻ tín dụng được gửi lại cho trình khách cùng với các 
thông tin về hóa đơn. 
Liệt kê 18. Máy chủ ứng dụng trả về kết quả của giao dịch thẻ tín dụng đến trình khách 
if(invoice!=null) 
{ 
msgxml.setValue("//ccinfo/@invoice",invoice); 
retValue=""+makePayment(msgxml,CCInfo)+""; 
Trong hàm giao dịch thẻ tín dụng, các thông tin về thẻ tín dụng và giỏ mua hàng được chiết xuất 
từ thông điện của trình khách. 
Liệt kê 19. Ứng dụng chiết xuất thông tin về thẻ tín dụng và giỏ mua hàng từ DOM 
XMLParse ccinfo=new XMLParse(cc); 
String units=msg.getValue("//ccinfo/@units"); 
String invno=msg.getValue("//ccinfo/@invoice"); 
String amount=msg.getValue("//ccinfo/@amount"); 
String ctype=ccinfo.getValue("//CC/@type"); 
String cnumber=ccinfo.getValue("//CC/@number"); 
String cexpdate=ccinfo.getValue("//CC/@expirydate"); 
String ccvv=ccinfo.getValue("//CC/@cvv"); 
String cname=ccinfo.getValue("//CC/name/text()"); 
String note="Paid by "+cname+" for "+units+" room(s) "; 
Các thông tin này được chuyển đến trung tâm dịch vụ thẻ tín dụng của PayPal bằng cách sử dụng 
các API cặp tên-giá trị (NVP) của chúng. 
API NVP là một giao diện đơn giản với các hàm nghiệp vụ, quản lý rủi ro và lô-gic nghiệp vụ 
của PayPal. Ở mức cơ bản nhất, việc sử dụng các API NVP rất dễ dàng, giống như gửi một chuỗi 
NVP qua kết nối HTTPS đến máy chủ của PayPal, và sau đó xử lý đáp ứng, nó cũng là một 
chuỗi NVP. Việc thực hiện cuộc gọi API NVP bao gồm các bước cơ bản sau đây: 
1. Xây dựng chuỗi tham số yêu cầu các NVP cho một phương thức API cụ thể. 
2. Gửi bằng HTTPS chuỗi tham số này đến một máy chủ PayPal. 
3. Xử lý các NVP trong đáp ứng từ máy chủ. 
Liệt kê 20. Ứng dụng trích xuất và tạo các cuộc gọi API NVP đến dịch vụ web của PayPal 
NVPEncoder encoder = new NVPEncoder(); 
encoder.add("METHOD","DoDirectPayment"); 
encoder.add("PAYMENTACTION","Sale"); 
encoder.add("AMT",amount); 
encoder.add("CREDITCARDTYPE",ctype); 
encoder.add("ACCT",cnumber); 
encoder.add("CVV2",ccvv); 
encoder.add("EXPDATE",cexpdate); 
encoder.add("FIRSTNAME",cname); 
encoder.add("CURRENCYCODE","USD"); 
 encoder.add("INVNUM",invno); 
 encoder.add("CUSTOM",note); 
String NVPString = encoder.encode(); 
String ppresponse = (String) caller.call(NVPString); 
NVPDecoder resultValues = new NVPDecoder(); 
resultValues.decode(ppresponse); 
String transactionId = (String)resultValues.get("TRANSACTIONID"); 
String amt = (String)resultValues.get("AMT"); 
String avsCode = (String)resultValues.get("AVSCODE"); 
String cvv2Match = (String)resultValues.get("CVV2MATCH"); 
String strAck = resultValues.get("ACK"); 
String strAckSMSG = resultValues.get("L_SHORTMESSAGE0"); 
String strAckLMSG = resultValues.get("L_LONGMESSAGE0"); 
String strAckLERR= resultValues.get("L_ERRORCODE0"); 
if(strAck !=null && !(strAck.equals("Success") || 
strAck.equals("SuccessWithWarning"))) 
{ 
return("PAYPAL Failed "+strAckLERR+" "+strAckSMSG+" "+strAckLMSG ); 
} 
Về đầu trang 
Tóm tắt 
Các ứng dụng dựa trên kiến trúc hướng Web có thể làm giảm sự phức tạp của thiết kế và của mã 
lệnh bằng cách sử dụng mô hình dữ liệu XML. Khi cơ sở dữ liệu được truy cập bằng cách sử 
dụng các API mức cao, chẳng hạn như SOAP và REST, thì khả năng tích hợp dữ liệu từ nhiều cơ 
sở dữ liệu đa dạng sẽ trở nên dễ dàng. Trong một thế giới doanh nghiệp luôn luôn tiến triển với 
những cuộc sáp nhập và các đột nhập về an ninh, thì cách tiếp cận hộp đen ẩn giấu dữ liệu doanh 
nghiệp sau các dịch vụ Web là một đòi hỏi quan trọng. XML là chất keo gắn kết kiến trúc này 
với nhau và mô hình dữ liệu XML là mô hình lập trình tự nhiên trong môi trường này. 

File đính kèm:

  • pdfLập trình với XML cho DB2, Phần 4 Tích hợp dữ liệu từ các nguồn dữ liệu khác nhau trong ứng dụng DB2 dựa trên web của bạn.pdf