Tài liệu 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 - Pdf 10

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
Giới thiệu
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.
Mã nguồn đi kèm với bài viết này có thể tải về và được biên dịch. Bạn cần cài đặt DB2 9 với các
tệp tin jar XML và JCC DB2 trong đường dẫn lớp cho Tomcat của bạn. Nếu bạn muốn kiểm thử
các giao dịch bằng thẻ tín dụng, thì bạn phải cài đặt các API Java của PayPal và có các tệp tin jar
ấy trong đường dẫn lớp cho Tomcat của bạn. Bạn cũng phải tạo một tài khoản trong hộp cát
(sandbox) của PayPal và nhận được các ủy quyền cho API của bạn, được nêu chi tiết trong Trung
tâm tích hợp PayPal. Sau đó bạn có thể sửa đổi các thông tin ủy quyền trong hàm setupPaypal()
trong tệp tin article4.java.
Về đầu trang
Kịch bản
Kịch bản là một khách hàng đặt phòng khách sạn qua web. Trước tiên ông ta đăng nhập vào để
lấy ra hồ sơ của mình. Sau đó, ông xác định thành phố để lấy danh sách các khách sạn có sẵn và
mức giá phòng của các khách sạn đó. Cuối cùng, ông chọn một khách sạn và đặt một phòng.

Hình 1. Kiến trúc mức tính năng


CC VARCHAR(1024) for bit data not null, INFO XML NOT NULL )

insert into CUSTOMERS values('hardeep',
encrypt('<CC type="visa" expirydate="12/2009" number="4721930402892796"
cvv="808">
<name>hardeep singh</name></CC>' , 'password'),
'<Customer customerid="hardeep" firstname="hardeep" lastname="singh"/>'); Hình 4. Đăng nhập

Khi nút Login được nhấn, hàm Javascript getCustomerInfo() được gọi trong trình khách. Hàm
này tạo cuộc gọi REST cần thiết để thực hiện các dịch vụ customerinfo trong máy chủ ứng dụng.

Liệt kê 2. Trình khách gọi để lấy hồ sơ người sử dụng

var cid=document.getElementById("userid").value;
var addr=servletpath+"?cmd=customerinfo&msg="+cid;
var xmlhttpObj= new XMLHttpRequest();
xmlhttpObj.open('GET', addr, true);
xmlhttpObj.onreadystatechange = function() {
getCustomerInfoCallback(xmlhttpObj); };
xmlhttpObj.send(""); Máy chủ ứng dụng thực hiện truy vấn SQL vào cơ sở dữ liệu nội bộ để lựa chọn hồ sơ khách
hàng từ cột info của bảng khách hàng.

Liệt kê 3. Máy chủ ứng dụng truy vấn cơ sở dữ liệu để lấy hồ sơ người sử dụng


id="citycode"
SIZE=15 MAXLENGTH=50 value="msy" tabindex="1">';
hstr+='<td><INPUT type=button value="submit" onClick="javascript:getRates()"
>';
document.getElementById("canvas").innerHTML=hstr; Bước 2
Bây giờ khách hàng tìm kiếm khách sạn ở thành phố nơi ông muốn đến du lịch.

Hình 5. Luồng lệnh và dữ liệu để liệt kê danh sách khách sạn và giá phòng

Người dùng nhập mã số thành phố và nhấp chuột vào nút submit để gọi hàm getRates() trong
Javascript của trình khách.

Hình 6. Tìm kiếm khách sạn theo mã thành phố

Hàm getRates tạo ra cuộc gọi cho máy chủ ứng dụng bằng cách sử dụng lược đồ XML
OTA_HotelAvailRQ, để yêu cầu thông tin về khách sạn.

Liệt kê 6. Tìm kiếm các thông điệp về khách sạn đã tạo ra bằng cách sử dụng lược đồ
OTA_HotelAvailRQ

var citycode=document.getElementById("citycode").value
var req='OTA_HotelSearchRQ xmlns="http://www.opentravel.org/OTA/2003/05"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.opentravel.org/OTA/2003/05
OTA_HotelSearchRQ.xsd"
EchoToken="HL" Target="Production" Version="1.003" PrimaryLangID="EN-US"
ResponseType="PropertyList">'+


String body="<db:getHotelRates xmlns:db='http://ibm.com/db2/soap'>"+
"<db:arg>"+msg+"</db:arg></db:getHotelRates>";
return sendURLMessage("http://localhost:8080/article4/db2soapdriver",
body,"http://ibm.com/db2/soap#article4");

Mặc dù có các API có sẵn để tạo thông điệp SOAP, bài viết này sử dụng mã lệnh gọi URL cơ
bản để minh họa rằng cuộc gọi SOAP không gì khác hơn là một cuộc gọi POST của HTTP trong
đó phần thân của thông điệp phù hợp với lược đồ XML chuẩn hóa.
Ghi chú: SOAPAction được đặt theo tên của cơ sở dữ liệu đích.

Liệt kê 9. Ứng dụng thực hiện cuộc gọi SOAP đến thủ tục lưu sẵn getHotelRates của DB2

URL u = new URL(url);
URLConnection uc = u.openConnection();
HttpURLConnection connection = (HttpURLConnection) uc;
connection.setDoOutput(true);
connection.setDoInput(true);
connection.setRequestMethod("POST");
connection.setRequestProperty("SOAPAction", database_name);
OutputStream out = connection.getOutputStream();
Writer wout = new OutputStreamWriter(out);
wout.write("<?xml version='1.0'?>\r\n");
>
wout.write("xmlns:SOAP-ENV=");
wout.write("'http://schemas.xmlsoap.org/soap/envelope/' ");
wout.write("xmlns:SOAP-ENC=");
wout.write("'http://schemas.xmlsoap.org/soap/encoding/' " );
wout.write("SOAP-ENV:encodingStyle=");
wout.write("'http://schemas.xmlsoap.org/soap/encoding/' ");

$info//ns1:HotelDescriptiveContents[@HotelCityCode=$req//ns1:HotelRef/@HotelC
ityCode]'
passing request as "req", info as "info" );
OPEN c_cur;
END

Đáp ứng SOAP được trả về cho máy chủ ứng dụng từ db2soapdriver, đến lượt nó, được gửi về
máy khách mà không có bất kỳ sửa đổi nào. Điều này một lần nữa nhấn mạnh rằng trong mô
hình lập trình XML, cơ sở dữ liệu trở thành một nhân tố chính và trong nhiề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='http://www.w3.org/1999/XSL/Transform'
xmlns:SOAP-ENV='http://schemas.xmlsoap.org/soap/envelope/'
xmlns:db='http://ibm.com/db2/soap'");

var hstr='<table cellSpacing="0" width="100%" cellPadding="2" border="1"
align="left">';
hstr+="<tr><td>name<td>rate<td>rooms<td>";

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.


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='<request cmd="bookroom"><message><ccinfo units="1" invoice=""
amount="'+amount+'"/><username>'+cid+'</username>
<hotelid>'+hotelid+'</hotelid></message></request>';
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.


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=http://schemas.xmlsoap.org/soap/envelope/;
db2=http://ibm.com/db2/soap";

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");


Nhờ tải bản gốc

Tài liệu, ebook tham khảo khác

Music ♫

Copyright: Tài liệu đại học © DMCA.com Protection Status