Cài đặt Oracle REST Data Services (ORDS) cho Oracle APEX
Công ty Vĩnh Cửu tuyển dụng lập trình viên Java

1- Giới thiệu

Tài liệu được viết dựa trên:
  • Oracle 11g, 12c

  • ORDS 3.x

2- Oracle REST Data Services là gì?

Oracle REST Data Services (ORDS) là một dịch vụ dữ liệu thay thế cho Oracle HTTP server và mod_plsql. Nó dựa trên Java EE cung cấp các dịch vụ RESTful và nâng cao khả năng bảo mật. Nó có thể triển khai trên WebLogic, Tomcat, Glassfish hoặc chạy độc lập.

3- Tương tác giữa Oracle ORDS và Oracle APEX

Thông thường bạn có 2 cách để cài đặt Oracle APEX.

Cách 1: Cấu hình Embedded PL/SQL Gateway: Đây là cách bạn cấu hình để Oracle APEX có thể chạy trên Oracle XML DB HTTP Server, nó là một HTTP sẵn có khi bạn cài đặt Oracle 11g hoặc mới hơn.

Cách 2: Cài đặt Oracle APEX trên một web server cụ thể chẳng hạn WebLogic, Tomcat hoặc Glassfish,...

Đường dẫn làm việc với Oracle APEX giống dưới đây:
  • http://your-server:8080/apex
Để sử dụng các dịch vụ RESTful bạn cần phải cài đặt thêm Oracle ORDS, nó có thể được triển khai trên WebLogic Server, Tomcat, Glassfish,.. hoặc chạy một cách độc lập. Oracle ORDS có thể đọc trực tiếp vào Oracle APEX và có thể thay thế hoàn toàn Oracle HTTP Server, chính vì vậy bạn có thể sử dụng các dịch vụ RESTful trên APEX và sử dụng URL mới để làm việc với Oracle APEX.
  • http://your-server:8080/ords

4- Download Oracle ORDS

Bạn có thể download Oracle ORDS tại:
Download được:

5- Cấu hình ORDS cho APEX

CD tới thư mục cài đặt apex.
Đăng nhập lại vào sqlplus với quyền sysdba.
Chạy lệnh để cấu hình REST Service.
-- Cấu hình REST Service.


@apex_rest_config.sql
Sau khi lệnh trên thực thi thành công, 2 user APEX_LISTENER và APEX_REST_PUBLIC_USER đã được tạo ra.
  1. APEX_LISTENER - Account sử dụng để truy vấn định nghĩa các dịch vụ RESTful được lưu trữ trong Oracle APEX.
  2. APEX_REST_PUBLIC_USER - Account được sử dụng khi gọi các định nghĩa dịch vụ được lưu trữ trong Oracle APEX.

Bật dịch vụ mạng (Network Services)

Mặc định, Dịch vụ mạng (Network Services) bị vô hiệu hóa trong Oracle 11g hoặc mới hơn. Vi vậy bạn phải sử dụng package DBMS_NETWORK_ACL_ADMIN để cấp quyền truy cập tới bất kỳ địa chỉ mạng nào cho user database APEX_050000.
Bạn cần phải query xem user APEX trong database:
Select Username from All_Users where username like 'APEX%';
Chạy lệnh để cấp quyền truy cập tới bất kỳ địa chỉ mạng nào cho user database APEX_050000.
Declare
   Acl_Path Varchar2(4000);
Begin
   -- Look for the ACL currently assigned to '*' and give APEX_050000
   -- the "connect" privilege if APEX_050000 does not have the privilege yet.
   Select Acl
   Into   Acl_Path
   From   Dba_Network_Acls
   Where  Host = '*'
   And    Lower_Port Is Null
   And    Upper_Port Is Null;
   If Dbms_Network_Acl_Admin.Check_Privilege(Acl_Path
                                            ,'APEX_050000'
                                            ,'connect') Is Null Then
      Dbms_Network_Acl_Admin.Add_Privilege(Acl_Path
                                          ,'APEX_050000'
                                          ,True
                                          ,'connect');
   End If;
Exception
   -- When no ACL has been assigned to '*'.
   When No_Data_Found Then
      Dbms_Network_Acl_Admin.Create_Acl('power_users.xml'
                                       ,'ACL that lets power users to connect to everywhere'
                                       ,'APEX_050000'
                                       ,True
                                       ,'connect');
      Dbms_Network_Acl_Admin.Assign_Acl('power_users.xml'
                                       ,'*');
End;
/

Commit;
 

Gán quyền kết nối cho user database APEX_050000 (Oracle 11g):

Declare
   Acl_Path Varchar2(4000);
Begin
   -- Look for the ACL currently assigned to '*' and give APEX_050000
   -- the "connect" privilege if APEX_050000
   --does not have the privilege yet.
   Select Acl
   Into   Acl_Path
   From   Dba_Network_Acls
   Where  Host = '*'
   And    Lower_Port Is Null
   And    Upper_Port Is Null;
   If Dbms_Network_Acl_Admin.Check_Privilege(Acl_Path
                                            ,'APEX_050000'
                                            ,'connect') Is Null Then
      Dbms_Network_Acl_Admin.Add_Privilege(Acl_Path
                                          ,'APEX_050000'
                                          ,True
                                          ,'connect');
   End If;
Exception
   -- When no ACL has been assigned to '*'.
   When No_Data_Found Then
      Dbms_Network_Acl_Admin.Create_Acl('power_users.xml'
                                       ,'ACL that lets power users to connect to everywhere'
                                       ,'APEX_050000'
                                       ,True
                                       ,'connect');
      Dbms_Network_Acl_Admin.Assign_Acl('power_users.xml'
                                       ,'*');
End;
/

Commit;

Gán quyền kết nối cho user database APEX_050000 (Oracle 12c):

Các thủ tục CREATE_ACL, ASSIGN_ACL, ADD_PRIVILEGE và CHECK_PRIVILEGE trong package DBMS_NETWORK_ACL_ADMIN đã lỗi thời trong Oracle Database 12c. Oracle khuyến cáo bạn sử dụng APPEND_HOST_ACE.
-- Sử dụng cho Oracle 12c.

BEGIN
    DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
        host => '*',
        ace => xs$ace_type(privilege_list => xs$name_list('connect'),
                           principal_name => 'APEX_050000',
                           principal_type => xs_acl.ptype_db));
END;
/

6- Triển khai ORDS

Chú ý: Đảm bảo rằng bạn đã cài đặt Java phiên bản 7 hoặc mới hơn. và khai báo biến môi trường PATH vào thư mục bin của Java. Bạn có thể xem hướng dẫn cài đặt Java tại:
Thêm vào cuối của PATH, đường dẫn tới thư mục bin của Java.
  • ;C:\DevPrograms\Java\jdk1.8.0_65\bin
Giải nén file ords-**.zip bạn đã download được ra một thư mục nào đó
Bạn có thể nhìn thấy trong thư mục giải nén ra có file ords.war
Copy thư mục images trong apex vào thư mục ords:
Bây giờ chúng ta sẽ cài đặt Oracle ORDS một cách độc lập (Không cần triển khai trên WebLogic, Tomcat hoặc một web server nào khác)
CD tới thư mục ords:
Tiếp theo đăng nhập vào sqlplus với quyền sysdba.
 
Oracle APEX của bạn đang chạy trên Oracle XML DB HTTP Server, bạn cần vô hiệu hóa nó bằng lệnh:
-- Vô hiệu hóa Oracle APEX trên Oracle XML DB HTTP Server.

EXEC DBMS_XDB.SETHTTPPORT(0);


-- Chú ý: Bạn có thể kích hoạt lại nó với lệnh:

EXEC DBMS_XDB.SETHTTPPORT(8080)
Thoát ra khỏi sqlplus. Và CD vào thư mục ords:
Chạy lệnh:
# Chạy lệnh:

java -jar ords.war

# Hoặc chạy lệnh:

java -jar ords.war install
Nhập vào địa chỉ của máy chứa database (Mặc định là localhost):
Cổng của database (Mặc định là 1521):
Nhập vào Service Name hoặc SID của database:
Nhập vào mật khẩu cho user database: ORDS_PUBLIC_USER
Sqlplus yêu cầu nhập lại thông tin user database có quyền sysdba. (Nhập sys và sau đó nhập password).
SQLPlus hỏi bạn có sử dụng Oracle APEX hay không, nếu có nhập vào 1, hãy nhập vào 1 và enter để tiếp tục:
Nhập mật khẩu cho user sẽ được tạo ra APEX_PUBLIC_USER:
Tiếp theo nhập vào 1 để chỉ định password cho 2 user database mới được tạo ra (APEX_LISTENER, APEX_REST_PUBLIC_USER).
Chọn 1 để triển khai ORDS một cách độc lập (Standalone).
Bạn đã cấu hình ORDS thành công. Đóng cửa sổ CMD lại.

Chạy ORDS

Chú ý: Bạn có thể chạy lệnh sau để xem thêm cách sử dụng:

 
java -jar ords.war help standalone
CD vào thư mục ORDS và chạy lệnh:
java -jar ords.war standalone --port 8080 --apex-images C:/DevPrograms/ords/images
Trong lần đầu tiên, nó sẽ hỏi vị trí đặt file cấu hình:
ORDS đã được triển khai thành công.
Chú ý: Nếu bạn nhận được lỗi:
Hãy mở khóa cho user APEX_PUBLIC_USER
Column username format a25;
Column account_status format a25;

-- Các user APEX đang bị khóa.

select username,account_status from dba_users
 where lock_date is not null
 and username like 'APEX%';
Alter user APEX_PUBLIC_USER account unlock;
Các file cấu hình cũng đã được tạo ra sau khi bạn triển khai ORDS:
Đừng tắt cửa sổ trên, bạn có thể sử dụng APEX với đường dẫn mới: