Truy cập các dịch vụ HTTP và RESTful từ DB2:
Giới thiệu các hàm REST được định nghĩa cho
người dùng DB2
Giới thiệu
Phù hợp với phiên bản DB2 nào?
Thông tin trong bài này phù hợp cho cả DB2 cho Linux®, UNIX® và Windows®
và DB2 cho z/OS®.
HTTP đã được định nghĩa hơn 20 năm trước đây khi người ta thực hiện sự thay đổi
lớn cuối cùng (HTTP 1.1) vào năm 1999 (xem RFC2616). Tuổi thọ của HTTP là
một dấu hiệu cho thấy nó đang ở trong một trạng thái ổn định. HTTP là giao thức
phổ biến nhất trên web. Theo thời gian, có thêm các giao thức và các mẫu sử dụng
như REST hay WebDAV được xây dựng dựa trên HTTP. Nhiều trang web và ứng
dụng cung cấp các giao diện dựa trên HTTP để truy cập thông tin.
Các định dạng khác được sử dụng trên web: JSON
Có rất nhiều định dạng dựa trên văn bản khác được sử dụng trên web hiện nay.
JSON đã trở nên rất phổ biến trong những năm gần đây. Bài "Xây dựng một ứng
dụng pureXML và JSON, Phần 1: Lưu trữ và truy vấn JSON với DB2 pureXML"
giới thiệu một cách có thể xử lý JSON trong DB2 bằng cách sử dụng JSONx để
chuyển đổi JSON thành XML và ngược lại.
Một số định dạng thông báo (chủ yếu là dựa trên XML) đã tiến hóa theo thời gian
và được sử dụng để trao đổi dữ liệu chung với HTTP như là tầng vận chuyển —
SOAP, RSS hoặc Atom, chẳng hạn.
Các hệ thống quản trị cơ sở dữ liệu quan hệ (các RDBMS) đã phát triển, cũng đưa
vào chức năng xử lý và lưu trữ cho nhiều loại dữ liệu hơn là dữ liệu quan hệ và
SQL, ví dụ như để hỗ trợ XML nguyên gốc.
Hình 1. Truy cập web từ DB2 thông qua các hàm REST
Trong bài này, chúng tôi giới thiệu các phần mở rộng cho SQL dưới dạng các hàm
do người dùng định nghĩa (UDF) để truy cập tài nguyên có thể lập địa chỉ URL qua
HTTP trực tiếp từ các câu lệnh SQL. Các hàm do người dùng định nghĩa được gọi
nghĩa dành cho DB2 cho LUW và DB2 cho z/OS và các ví dụ mẫu khác. Gói phần
mềm tải về cung cấp một tập hợp các hàm vô hướng cơ bản cũng như một số hàm
của trình trợ giúp.
Về đầu trang
Các hàm REST vô hướng cơ bản
Các hàm vô hướng cơ bản cung cấp quyền truy cập vào nội dung trên web. Hàm
REST có sẵn bốn lệnh phổ biến nhất của HTTP: GET, POST, PUT và DELETE.
Có hai phương thức: một phương thức để xử lý nội dung nhị phân và một phương
thức dùng cho nội dung dựa trên văn bản. Lược đồ DB2 cho các hàm là DB2XML.
Tất cả các hàm REST cơ bản đều là các hàm vô hướng để trả về nội dung của
thông báo đáp ứng HTTP như BLOB (nhị phân) hoặc CLOB (văn bản). Các chữ
ký hàm theo mẫu sau:
DB2XML.HTTP<method><type>(url, httpHeader <,
input>) Bảng 1. Tên phương thức
phương
thức
GET, POST, PUT, DELETE
kiểu
BLOB (nội dung nhị phân) hoặc CLOB (nội dung văn bản) định nghĩa
kiểu trả về và kiểu tài liệu <input> Bảng 2. Tham số input (đầu vào)
url (Bắt buộc) URL của tài nguyên đang được truy cập
httpHeader(tùy chọn) các giá trị đầu trang bổ sung được sử dụng với yêu cầu này
input
(chỉ với POST, PUT) dữ liệu được gửi cùng với yêu cầu, như là một
Bảng 3. Các tùy chọn có thể được chỉ rõ với <httpHeader>
Tên thuộc tính Kiểu Mặc định Mô tả
connectionTimeout
Integer (Số
nguyên)
Mặc định hệ
thống
Thời gian chờ tính bằng miligiây
readTimeout
Integer (Số
nguyên)
Mặc định hệ
thống
Thời gian chờ tính bằng miligiây
followRedirects
Boolean (Luận
lý)
True (Đúng)
Định nghĩa, nếu cần tiếp sau các
chuyển hướng
useCaches
Boolean (Luận
lý)
True (Đúng)
Định nghĩa, nếu cần sử dụng các
bộ nhớ đệm
Hình 2. Sử dụng các hàm REST UDF và DB2 pureXML để xử lý một nguồn cấp
tin
Đầu tiên, chúng ta hãy xem xét nguồn cấp dữ liệu RSS của BBC bằng cách sử
dụng câu lệnh sau:
SELECT
DB2XML.HTTPGETCLOB(' />k','')
FROM SYSIBM.SYSDUMMY1;
Bây giờ chúng ta có thể bọc quanh một cuộc gọi hàm XMLTABLE để chuyển đổi
định dạng RSS XML được trả về thành một tập hợp kết quả quan hệ.
Liệt kê 3. Chia nhỏ nguồn tin BBC vào một tập hợp dữ liệu quan hệ
SELECT *
FROM XMLTABLE('$result/rss/channel/item'
PASSING XMLPARSE(
DOCUMENT
DB2XML.HTTPGETBLOB(' />k','')
) as "result"
COLUMNS
title VARCHAR(128) PATH 'title',
description VARCHAR(1024) PATH 'description',
link VARCHAR(255) PATH 'link',
pubDate VARCHAR(20) PATH 'substring(pubDate, 1,
16)'
) AS RESULT;
Tập hợp kết quả có bốn cột: TITLE chứa tiêu đề của mục nguồn cấp tin,
truyền thông trên tầng socket bảo mật (SSL). Truyền thông SSL cần có một kho
lưu trữ chứng chỉ trên máy khách để lưu các chứng chỉ máy chủ. Việc quản lý kho
lưu trữ có thể phụ thuộc vào việc thực hiện JSSE. IBM JDK có cách thực hiện
riêng của mình với các phần mở rộng đặc biệt cho z/OS (xem Việc thực hiện JSSE
của IBM trên z/OS).
Các hàm REST hỗ trợ xác thực cơ bản HTTP cũng như mã hóa SSL bằng cách sử
dụng HTTPS.
Ví dụ sau đây cho thấy cách có thể lấy ra các thông báo chưa đọc từ tài khoản
Google Mail của bạn và phân tích cú pháp các thông báo đó thành một tập hợp kết
quả quan hệ khi sử dụng hàm XMLTABLE.
Sử dụng các chứng chỉ với các hàm REST UDF
Việc truy cập vào Gmail được mã hóa bằng SSL và được bảo vệ bằng cách sử
dụng xác thực HTTP cơ bản (sử dụng $quot;https" trong URL). Gmail trả về các
đầu đề cho các thông báo chưa đọc như là nguồn cấp dữ liệu Atom và chúng tôi sử
dụng hàm XMLTABLE trong ví dụ này để trả về kết quả là một tập hợp dữ liệu
quan hệ.
Liệt kê 5. Lấy ra các thông báo chưa đọc từ Gmail bằng cách sử dụng SSL và xác
thực HTTP
SELECT *
FROM XMLTABLE('$result/*[local-name()=''feed'']/*[local-name()=''entry'']'
PASSING
XMLPARSE(DOCUMENT
DB2XML.HTTPGETBLOB('https://<username>:<password>@mail.google.com/
mail/feed/atom/',''))
AS "result"
FROM SYSIBM.SYSDUMMY1
Result:
Please+send+and+email+to+report+our+%25+earnings+to+Mark+%26+Lisa+at+
marklisa%40xyz.com Liệt kê 7. Ví dụ về giải mã-URL
SELECT DB2XML.URLDECODE(
'Please+send+and+email+to+report+our+%25+earnings+to+Mark+%26+Lisa+at+
marklisa%40xyz.com'
, NULL)
FROM SYSIBM.SYSDUMMY1
Result:
Please send and email to report our % earnings to Mark & Lisa at Mã hóa/giải mã Base64
Mã hóa Base64 được sử dụng rộng rãi trên web để biểu diễn dữ liệu nhị phân là
một chuỗi (ví dụ, khi gửi các khóa băm). Gói phần mềm tải về đi kèm với hai hàm
để thực hiện mã hóa và giải mã Base64.
Liệt kê 8. Ví dụ về mã hóa-Base64
SELECT DB2XML.BASE64ENCODE(
CAST(
proxy HTTP vì các hàm REST UDF được thực hiện trong Java. Có thể sử dụng các
thuộc tính sau đây:
http.proxyHost
http.proxyPort
http.proxyUser
http.proxyPassword
http.nonProxyHosts
DB2 cho Linux, UNIX, Windows không cung cấp quyền truy cập vào các thuộc
tính của hệ thống JVM. Các hàm REST UDF sẽ kiểm tra một tệp restudf.properties
trong thư mục $ DB2INSTPATH/function để thay thế, trong tệp đó người dùng có
thể chỉ rõ các thiết lập proxy HTTP như sau:
Liệt kê 10. Các thiết lập proxy HTTP trong tệp restudf.properties
http.proxyHost=myProxyHost.com
http.proxyPort=8090
http.proxyUser=user
http.proxyPassword=secret
http.nonProxyHosts=*.ibm.com|wikipedia.org|
Trên DB2 cho z/OS, bạn có thể chỉ rõ các thuộc tính đó trong tệp JVMPROPS như
sau (cũng xem tệp installationNotesUDFzOS.txt trong bản tải về):
Liệt kê 11. Các thiết lập proxy HTTP trong tệp JVMPROPS
-Dhttp.proxyHost=myProxyHost.com
-Dhttp.proxyPort=8090
-Dhttp.proxyUser=user
-Dhttp.proxyPassword=secret
-Dhttp.nonProxyHosts=*.ibm.com|wikipedia.org|
GET
Lấy ra một nguồn tài
nguyên qua mộ
t URL
đã cho thông qua
GET HTTP. Tài
nguyên được trả về
là
LOB nhị phân
(BLOB).
httpGetClob CLOB
httpGetClob(url
VARCHAR(2048),
httpHeader CLOB
(10K)) RETURNS
CLOB(5M)
GET
Lấy một nguồn tài
nguyên dựa trên văn
bản qua một URL đã
cho thông qua GET
HTTP. Tài nguyên
được trả về là LOB
ký tự (CLOB). Thực
hiện chuyển đổi bộ
ký tự thành trang mã
cơ sở dữ liệu nếu cần
.
httpPutBlob BLOB
httpPutBlob(url
dụng PUT HTTP.
Một thông báo đáp
ứng được trả về là
LOB ký tự (CLOB)
nếu máy chủ ban
hành thông báo đáp
ứng đó. Thực hiện
chuyển đổi bộ ký tự
nếu cần.
httpPostBlob BLOB
httpPostBlob(url
VARCHAR(2048),
httpHeader CLOB
(10K), data
BLOB(5M))
RETURNS
BLOB(5M)
POST
Cập nhật một nguồn
tài nguyên nhị phân
trong một URL đã
cho bằng cách sử
dụng POST HTTP.
Một thông báo đáp
ứng được trả về là
LOB nhị phân
(BLOB).
httpPostClob CLOB
httpPostClob(url
VARCHAR(2048),
Thông báo đáp ứng
được trả về là LOB
nhị phân (BLOB) nế
u
có bất kỳ vấn đề nào.
httpDeleteClobCLOB
httpDelete(url
VARCHAR(2048),
httpHeader CLOB
(10K)) RETURNS
CLOB
DELETE
Xóa một nguồn tài
nguyên văn bả
n trong
URL đã cho bằng
cách sử dụng
DELETE HTTP.
Thông báo đáp ứng
được trả về là LOB
(CLOB) ký tự nếu có
bất kỳ vấn đề nào.
Thực hiện chuyển đổ
i
bộ ký tự nếu cần.
httpBlob BLOB
httpBlob(url
VARCHAR(2048),
(10K), data
CLOB(5M))
RETURNS CLOB
Bất kỳ
động từ
HTTP
nào
Thực hiện một yêu
cầu HTTP với động
từ được cung cấp.
Một thông báo đáp
ứng có thể đượ
c cung
cấp là LOB ký tự
(CLOB). Một thông
báo đáp ứng được trả
về là LOB ký tự
(CLOB) nếu máy chủ
ban hành thông báo
đáp ứng. Thực hiện
chuyển đổi bộ ký tự
nếu cần.
httpHead CLOB/XML
httpHead(url
VARCHAR(2048),
httpHeader CLOB
(10K)) RETURNS
CLOB (10K)
urlDecode VARCHAR
urlDecode(text
VARCHAR(2048),
encoding VARCHAR(20))
RETURNS
VARCHAR(4096)
Hàm của trình trợ giúp để
thực hiện giải mã-URL củ
a
văn bản được cung cấp.
Giá trị mã hóa định nghĩa
bộ ký tự được sử dụng. Có
thể đặt giá trị này là NULL
thì bộ ký tự UTF-8 được sử
dụng theo mặc định.
base64Encode
VARCHAR
base64Encode(text
VARCHAR(2732) FOR
BIT DATA) RETURNS
VARCHAR(4096)
Hàm của trình trợ giúp để
thực hiện mã hóa Base64
dữ liệu nhị phân được
cung
cấp để trả về dữ liệu là
chuỗi mã hóa Base64.
base64Decode