Hãy thực hiện các bước để tạo một ví dụ ứng dụng DB2 sử dụng mô hình XML để tích hợp dữ liệu từ các nguồn dữ liệu khác nhau. Hãy tìm hiểu cách để trưng ra các thủ tục lưu sẵn trong cơ sở dữ liệu của bạn thành các dịch vụ web để có thể truy cập chúng thông qua các cuộc gọi SOAP. Hãy theo kiến trúc hướng Web, một kiến trúc lắp ghép thông tin được lưu giữ ở phía sau các bức tường lửa khác nhau của tổ chức.
30 trang |
Chia sẻ: haohao89 | Lượt xem: 1680 | Lượt tải: 1
Bạn đang xem trước 20 trang tài liệu Lập trình với XML cho DB2: 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 DOWNLOAD ở trên
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
Hardeep Singh, Kiến trúc sư các công nghệ nâng cao, IBM
Tóm tắt: Hãy thực hiện các bước để tạo một ví dụ ứng dụng DB2 sử dụng mô
hình XML để tích hợp dữ liệu từ các nguồn dữ liệu khác nhau. Hãy tìm hiểu cách
để trưng ra các thủ tục lưu sẵn trong cơ sở dữ liệu của bạn thành các dịch vụ web
để có thể truy cập chúng thông qua các cuộc gọi SOAP. Hãy theo kiến trúc hướng
Web, một kiến trúc lắp ghép thông tin được lưu giữ ở phía sau các bức tường lửa
khác nhau của tổ chức. Cách tiếp cận kiểu xếp hình Lego đối với kiến trúc ứng
dụng không những cho phép tích hợp các nguồn dữ liệu đa dạng, mà còn giúp bạn
nhanh chóng lắp ghép các ứng dụng theo chiều dọc. Một lần nữa, bạn sẽ thấy rằng
XML là công nghệ làm cho tất cả những việc này khả thi và cách tốt nhất để khai
thác nó là lập trình với mô hình dữ liệu XML.
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.
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
Các hành động của khách hàng trong máy khách dẫn đến kết quả là các cuộc gọi
REST được thực hiện từ trình duyệt web đến máy chủ ứng dụng. Đến lượt mình
máy chủ ứng dụng có thể:
Trực tiếp kết nối đến cơ sở dữ liệu nội bộ bằng cách sử dụng JDBC để lấy
hồ sơ của khách hàng.
Thực hiện cuộc gọi SOAP tới cơ sở dữ liệu khác bên trong tường lửa của
doanh nghiệp, nhưng ở sau tường lửa nội bộ của các bộ phận đặt phòng.
Thực hiện cuộc gọi REST đến nhà cung cấp dịch vụ giao dịch bằng thẻ tín
dụng bên ngoài như PayPal.
Hình 2. Kiến trúc mức thiết kế
Chi tiết
Để hiểu được những gì xảy ra đằng sau hậu trường khi khách hàng đi qua từng
bước của quá trình đặt phòng, bạn hãy nhìn vào luồng thông tin và đoạn mã lệnh
làm cho quá trình này có thể thực hiện được.
Bước 1
Khách hàng nhập tên của mình vào trang web của đại lý du lịch và nhận hồ sơ của
mình. Để đơn giản, không yêu cầu mật khẩu và giả sử rằng hồ sơ của khách hàng
đã tồn tại trong cơ sở dữ liệu của các đại lý.
Hình 3. Luồng lệnh và dữ liệu để đăng nhập và lấy hồ sơ
Hồ sơ khách hàng, là một tài liệu XML, được lưu trữ trong cơ sở dữ liệu trong một
cột XML. Các thông tin về thẻ tín dụng cũng là một tài liệu XML, nhưng nó được
mật mã hóa và lưu trữ trong định dạng nhị phân nhằm mục đích an ninh.
Liệt kê 1. Tạo bảng khách hàng và chèn bản ghi
CREATE TABLE CUSTOMERS (CUSTID CHARACTER (64) NOT NULL,
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">
hardeep singh' , 'password'),
'');
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
Connection conn= DriverManager.getConnection("jdbc:db2:article4");
Statement stmt = conn.createStatement();
stmt.setMaxRows(1);
ResultSet rs= stmt.executeQuery(
"select info from customers where custid='"+msg+"'");
if(rs.next ()) retValue=rs.getString(1);
stmt.close();
conn.close();
Dữ liệu khách hàng từ việc truy vấn cơ sở dữ liệu được gửi lại cho trình khách
dưới dạng dữ liệu XML.
Liệt kê 4. Tiêu đề của HTTP cho dữ liệu trả về được thiết đặt là XML
_res.setContentType("text/xml");
_res.setHeader("Cache-Control", "no-cache");
_res.getWriter().write(retValue);
Khi trình khách nhận được dữ liệu khách hàng từ máy chủ ứng dụng, nó gọi hàm
getCustomerInfoCallback, ở đây dữ liệu XML của khách hàng được phân tích cú
pháp thành cây DOM bằng cách sử dụng lớp bao bọc XMLParse và được lưu
trong một biến toàn cục. Giao diện người dùng được thay đổi để cho phép khách
hàng nhập mã số của thành phố để liệt kê các khách sạn ở đó.
Liệt kê 5. Tiêu đề của HTTP cho dữ liệu trả về được thiết đặt là XML
customerinfo= new xmlparse(xmlhttp.responseXML, false);
var hstr='<table cellSpacing="0" width="100%" cellPadding="2" border="0"
align="left">';
hstr+='City Code:<INPUT type="text"
id="citycode"
SIZE=15 MAXLENGTH=50 value="msy" tabindex="1">';
hstr+='<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=""
xmlns:xsi=""
xsi:schemaLocation="
OTA_HotelSearchRQ.xsd"
EchoToken="HL" Target="Production" Version="1.003" PrimaryLangID="EN-
US"
ResponseType="PropertyList">'+
'<Source AirlineVendorID="FG" PseudoCityCode="MIA"
ISOCountry="US"
ISOCurrency="USD" AgentSine="A4444BM"
AgentDutyCode="FR">'+
'<RequestorID Type="5" ID="12345675"
ID_Context="IATA"/>'+
'<CodeRef LocationCode="23"
CodeContext="OTA-REF code list"/>'+
'<Radius Distance="2"
DistanceMeasure="MILES"/>'+
'<RoomAmenity
RoomAmenity="123"/>
';
Cuộc gọi danh sách khách sạn đượ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.
Liệt kê 7. Tìm kiếm thông điệp khách sạn được gửi đến máy chủ ứng dụng
var msg=''+req+'';
var xmlhttpObj= new XMLHttpRequest();
xmlhttpObj.open('POST', servletpath, true);
xmlhttpObj.onreadystatechange = function() { getRatescallback(xmlhttpObj); };
xmlhttpObj.setRequestHeader('content-type', 'text/xml');
xmlhttpObj.send(msg);
Máy chủ ứng dụng tạo cuộc gọi SOAP tới thủ tục lưu sẵn getHotelRates 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ộ tại tại địa chỉ
Yêu cầu tìm kiếm khách sạn của OTA (msg) nhận
được từ trình khách được chuyển như một đối số đến thủ tục lưu sẵn.
Ghi chú: Thuộc tính SOAPAction của thông điệp SOAP được đặt theo tên của cơ
sở dữ liệu.
Liệt kê 8. Ứng dụng thực hiện cuộc gọi SOAP đến thủ tục lưu sẵn
getHotelRates của DB2
String body=""+
""+msg+"";
return sendURLMessage("",
body,"");
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("\r\n");
>
wout.write("xmlns:SOAP-ENV=");
wout.write("' ");
wout.write("xmlns:SOAP-ENC=");
wout.write("' " );
wout.write("SOAP-ENV:encodingStyle=");
wout.write("' ");
wout.write("xmlns:xsi=");
wout.write("'> ");
wout.write(" ");
wout.write(msg);
wout.write(" ");
wout.write("\r\n");
Vì rằng máy chủ ứng dụng không làm gì khác hơn là tạo ra lớp bao bọc SOAP và
gọi cuộc gọi URL, nếu các hạn chế an ninh trong AJAX cho phép, ta có thể cho
rằng cuộc gọi SOAP cũng đã có thể được thực hiện trực tiếp từ trình khách. Mặc
dù các cuộc gọi trực tiếp đến cơ sở dữ liệu từ một trình khách Web bằng cách sử
dụng trình điều khiển SOAP là khả thi, chúng không được mong muốn vì lý do an
ninh và trình điều khiển SOAP cần được tăng cường để ngăn chặn điều này xảy ra.
Thủ tục lưu sẵn getHotelRates chỉ nhận một tham đối XML là yêu cầu OTA.
XQuery chiết xuất HotelCityCode từ XML đầu vào và sử dụng nó để tìm kiếm và
liệt kê tất cả các khách sạn có thuộc tính HotelCityCode so khớp.
Liệt kê 10. Thủ tục lưu sẵn getHotelRates
CREATE PROCEDURE getHotelRates( IN request XML )
DYNAMIC RESULT SETS 1
LANGUAGE SQL
BEGIN
DECLARE c_cur CURSOR WITH RETURN FOR
Select XMLQuery('declare namespace ns1 = "";
$info//ns1:HotelDescriptiveContents' passing info as "info")
from hotel
where xmlexists('declare namespace ns1 = "";
$info//ns1:HotelDescriptiveContents[@HotelCityCode=$req//ns1:HotelRef/@HotelCityCode]'
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='
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",cnam