HTTP 功能概觀

這些 HTTP 函數用來發出使用 Web 服務的 HTTP 要求。 這些函數可讓 SQL 程式設計師透過 SQL 使用「具象狀態傳輸 (RESTful)」,包括內嵌式 SQL。 它們提供與 SYSTOOLS HTTP 函數相同的功能,而不會產生建立 JVM 的額外負擔。 這些函數使用屬於 ILE 支援之 Integrated Web Services (IWS) 用戶端的 HTTP 傳輸 API。

若要使用 HTTP 功能,系統上必須安裝 5770SS1 選項 3 (延伸基本目錄支援) 及 5770SS1 選項 34 (數位 Certificate Manager)。

這些 HTTP 函數存在於 QSYS2 中,且其額外負擔低於 SYSTOOLS HTTP 函數。 QSYS2 HTTP 功能的其他好處包括 HTTP 鑑別、Proxy 支援、可配置重新導向嘗試及可配置 SSL 選項。

URL 參數支援 http: URL。 URL 指出應該透過安全通訊通道進行網路通訊。 一個 https 要求使用 TLS (傳輸層安全) 來建立安全通道。 此安全通道會加密任何已傳輸的資料,並防止中間人攻擊。 任何包含安全資訊的通訊都應該使用 https 而非 http。 由於使用者 ID 和密碼的機密本質, HTTP URL 不容許 HTTP 鑑別。

HTTP 服務是使用 QSYS/QSQAXISC 服務程式來實作。 系統管理者可以透過修改 QSYS/QSQAXISC 服務程式的權限,來停用 HTTP 服務的存取權。 與 QSYS/QSQAXISC 服務程式相關聯的權限會套用至所有 HTTP 功能。

基礎 HTTP 函數

基礎函數是根據提出 HTTP 要求時所使用的 變更開始三個變更結束 維度來命名。
  • 第一個維度是 HTTP 作業。 有 5 個不同的 HTTP 作業 :GET、PUT、POST、 變更開始PATCH變更結束及 DELETE。
  • 變更開始第二個維度是用於傳送及傳回資料的資料類型。 有兩個替代方案 :BLOB 和 CLOB 的隱含值。變更結束
  • 第三個維度指出是否應該使用函數的詳細版本。 非詳細函數是純量函數。 詳細函數是傳回單一列的表格函數,其中包括從 HTTP 伺服器傳送的傳回標頭資訊。 標頭資訊格式化為 JSON。

函數名稱會反映這些維度。 例如, HTTP_GET_VERBOSE 會使用第一個維度中的 GET 作業、第二個維度中的 CLOB 資料類型,以及第三個維度中的 VERBOSE 設定。

下表彙總函數。
表 1. 基礎 HTTP 功能
功能 說明 文件鏈結
HTTP 刪除 發出 HTTP DELETE 要求並傳回 CLOB 資料。 HTTP_DELETE 及 HTTP_DELETE_BLOB 純量函數
變更開始HTTP 刪除二進位大型物件變更結束 變更開始發出 HTTP DELETE 要求並傳回 BLOB 資料。 變更結束 變更開始HTTP_DELETE 及 HTTP_DELETE_BLOB 純量函數變更結束
變更開始HTTP _DELETE_BLOB_VERBOSE變更結束 變更開始建立 HTTP DELETE 要求,並傳回 BLOB 資料和回應標頭。 變更結束 變更開始HTTP_DELETE_VERBOSE 和 HTTP_DELETE_BLOB_VERBOSE 表格函數變更結束
HTTP _DELETE_VERBOSE 發出 HTTP DELETE 要求,並傳回 CLOB 資料及回應標頭。 HTTP_DELETE_VERBOSE 及 HTTP_DELETE_BLOB_VERBOSE 表格函數
HTTP GET 發出 HTTP GET 要求並傳回 CLOB 資料。 HTTP_GET 及 HTTP_GET_BLOB 純量函數
變更開始HTTP _GET_BLOB變更結束 變更開始建立 HTTP GET 要求並傳回 BLOB 資料。 變更結束 變更開始HTTP_GET 及 HTTP_GET_BLOB 純量函數變更結束
變更開始HTTP_GET_BLOB_VERBOSE變更結束 變更開始建立 HTTP GET 要求並傳回 BLOB 資料和回應標頭。 變更結束 變更開始HTTP_GET_VERBOSE 及 HTTP_GET_BLOB_VERBOSE 表格函數變更結束
HTTP _GET_VERBOSE 發出 HTTP GET 要求並傳回 CLOB 資料及回應標頭。 HTTP_GET_VERBOSE 及 HTTP_GET_BLOB_VERBOSE 表格函數
變更開始HTTP 修補程式變更結束 變更開始建立 HTTP PATCH 要求並傳回 CLOB 資料。 變更結束 變更開始HTTP_PATCH 及 HTTP_PATCH_BLOB 純量函數變更結束
變更開始HTTP 修補程式二進位大型物件變更結束 變更開始建立 HTTP PATCH 要求並傳回 BLOB 資料。 變更結束 變更開始HTTP_PATCH 及 HTTP_PATCH_BLOB 純量函數變更結束
變更開始HTTP _ 修補程式 _BLOB_VERBOSE變更結束 變更開始建立 HTTP PATCH 要求並傳回 BLOB 資料及回應標頭。 變更結束 變更開始HTTP_PATCH_VERBOSE 和 HTTP_PATCH_BLOB_VERBOSE 表格函數變更結束
變更開始HTTP _ 修補程式詳細變更結束 變更開始建立 HTTP PATCH 要求並傳回 CLOB 資料及回應標頭。 變更結束 變更開始HTTP_PATCH_VERBOSE 和 HTTP_PATCH_BLOB_VERBOSE 表格函數變更結束
HTTP POST 發出 HTTP POST 要求並傳回 CLOB 資料。 HTTP_POST 及 HTTP_POST_BLOB 純量函數
變更開始HTTP 公佈二進位大型物件變更結束 變更開始建立 HTTP POST 要求並傳回 BLOB 資料。 變更結束 變更開始HTTP_POST 及 HTTP_POST_BLOB 純量函數變更結束
變更開始HTTP _POST_BLOB_VERBOSE變更結束 變更開始建立 HTTP POST 要求並傳回 BLOB 資料和回應標頭。 變更結束 變更開始HTTP_POST_VERBOSE 和 HTTP_POST_BLOB_VERBOSE 表格函數變更結束
HTTP 後置詳細 發出 HTTP POST 要求,並傳回 CLOB 資料及回應標頭。 HTTP_POST_VERBOSE 和 HTTP_POST_BLOB_VERBOSE 表格函數
HTTP PUT 發出 HTTP PUT 要求並傳回 CLOB 資料。 HTTP_PUT 及 HTTP_PUT_BLOB 純量函數
變更開始HTTP _PUT_BLOB變更結束 變更開始發出 HTTP PUT 要求並傳回 BLOB 資料。 變更結束 變更開始HTTP_PUT 及 HTTP_PUT_BLOB 純量函數變更結束
變更開始HTTP _ PUT_BLOB_VERBOSE變更結束 變更開始建立 HTTP PUT 要求並傳回 BLOB 資料和回應標頭。 變更結束 變更開始HTTP_PUT_VERBOSE 和 HTTP_PUT_BLOB_VERBOSE 表格函數變更結束
HTTP _ 詳細 發出 HTTP PUT 要求並傳回 CLOB 資料及回應標頭。 HTTP_PUT_VERBOSE 及 HTTP_PUT_BLOB_VERBOSE 表格函數
這些 HTTP 函數會傳遞參數,指出要存取的 HTTP 伺服器、HTTP 標頭的設定,以及要傳送至伺服器的任何資料。 每一個 HTTP 函數的參數都類似。
  • 第一個參數是用來存取伺服器的 URL。
  • 最後一個參數是字串,指出要在要求上使用的選項。 這些選項包括 HTTP 標頭的設定。 字串是具有下列格式的 JSON 物件:
    {"option1":"option-setting1","option2":"option-setting2"}

以下說明這些選項: HTTP 選項

公用程式 HTTP 函數

部分其他 HTTP 函數是用於處理 HTTP 要求的公用程式函數。
表 2. HTTP 公用程式函數
功能 說明 文件鏈結
BASE64_DECODE 傳回已 Base64 解碼的位元資料字串。 BASE64_DECODE 純量函數
BASE64_ENCODE 傳回字串的 Base64 編碼版本。 BASE64_ENCODE 純量函數
URL_DECODE 解碼 URL 編碼字串。 URL_DECODE 純量函數
URL_ENCODE 使用 URL 編碼對字串進行編碼。 URL_ENCODE 純量函數

SSL 注意事項

依預設, HTTP 功能會使用系統預設憑證儲存庫: /QIBM/USERDATA/ICSS/CERT/SERVER/DEFAULT.KDB。 依預設,此憑證儲存庫不存在。 數位 Certificate Manager (DCM) 可用來建立此憑證儲存庫,並將憑證新增至此憑證儲存庫。

如果您的應用程式選擇信任 JVM 所使用的憑證,則可以使用下列 SQL 陳述式來建立可供 HTTP 函數使用的憑證儲存庫 (/home/javaTrustStore/fromJava.KDB)。 這個程序會使用安裝 64 位元 Java™ 8 時所包含的 /QOpenSys/QIBM/ProdData/JavaVM/jdk80/64bit/jre/lib/security/cacerts Java 信任儲存庫。 此 Script 可以變更為使用更新的 Java 信任儲存庫。 Script 也會使用 Qshell ,這需要 5770SS1 選項 30。 此 Script 假設使用者尚未修改 Java 信任儲存庫。 如果已修改 Script ,則必須修改 Script 以符合那些變更。

在此範例中, changeit 是 Java 隨附的 cacerts 檔案的預設密碼。 在設定期間會使用臨時密碼 xyz789 ,它會立即取代為最終密碼。 abc123 是新建立之憑證儲存庫的最終密碼。

此程序要求使用者有權建立 /home/javaTrustStore 目錄,並且有權讀取 cacerts 檔案。
-- The following SQL script generates a KDB trust store from a Java trust  
-- store using an intermediate JKS trust store.  The IFS directory and  
-- name of the KDB trust store are set in the NEW_TRUST_DIRECTORY and 
-- NEW_TRUST_STORE variables below. 
--  
-- Create an SQL schema to contain temporary variables. 
-- The user must have permission to create a schema.  
-- 
CREATE SCHEMA FROM_JAVA_TRUST_STORE;
SET SCHEMA FROM_JAVA_TRUST_STORE;
SET PATH CURRENT PATH, FROM_JAVA_TRUST_STORE;

--
-- Define global variables for parameters to the procedure for generating new trust store. 
-- 

-- Specify the IFS directory to use for the new trust store.
-- In this example, we use /home/javaTrustStore
-- The user must have *W authority to /home in order to create this  
-- directory.  
CREATE OR REPLACE VARIABLE   NEW_TRUST_DIRECTORY VARCHAR(80) CCSID 37;
SET NEW_TRUST_DIRECTORY='/home/javaTrustStore'; 

-- Specify the name of the new trust store name
-- In this example, the name is fromJava.KDB
CREATE OR REPLACE VARIABLE   NEW_TRUST_STORE VARCHAR(80) CCSID 37;
SET NEW_TRUST_STORE = NEW_TRUST_DIRECTORY CONCAT '/fromJava.KDB'; 

-- Specify the password for the trust store.  This
-- should be changed to keep the new trust store secure. 
CREATE OR REPLACE VARIABLE   NEW_TRUST_STORE_PASSWORD VARCHAR(80) CCSID 37;
SET NEW_TRUST_STORE_PASSWORD= 'abc123';

-- Specify the Java trust store to use. 
CREATE OR REPLACE VARIABLE   JAVA_TRUST_STORE VARCHAR(80) CCSID 37;
SET JAVA_TRUST_STORE='/QOpenSys/QIBM/ProdData/JavaVM/jdk80/64bit/jre/lib/security/cacerts';

-- Specify the Java trust store password.  The default password is changeit.
-- If the password has been changed on the system, the correct value will need to be used. 
CREATE OR REPLACE VARIABLE   JAVA_TRUST_STORE_PASSWORD VARCHAR(80) CCSID 37; 
SET JAVA_TRUST_STORE_PASSWORD = 'changeit';

-- Specify the name of a temporary JKS format TRUST STORE.  
-- In this example, jksExport is used.
CREATE OR REPLACE VARIABLE JKS_TRUST_STORE VARCHAR(80) CCSID 37; 
SET JKS_TRUST_STORE = NEW_TRUST_DIRECTORY CONCAT '/jksExport';

-- Specify the password of the temporary JKS format TRUST STORE. 
-- In this example, xyz789 is used as the password.
CREATE OR REPLACE VARIABLE JKS_TRUST_STORE_PASSWORD VARCHAR(80) CCSID 37; 
SET JKS_TRUST_STORE_PASSWORD = 'xyz789' ;


-- Step 1.  Use QCMDEXC and QSH and mkdir to create a directory in which 
--          to save the new store file
CALL QSYS2.QCMDEXC( 'QSH CMD(''mkdir ' CONCAT NEW_TRUST_DIRECTORY CONCAT ''')');


-- Step 2.  Use QCMDEXC and QSH to run the keytool command to export 
--          the default java certificate store in PKCS12 format
CALL QSYS2.QCMDEXC(
   'QSH CMD(''keytool -importkeystore ' CONCAT
   ' -srcstorepass ' CONCAT JAVA_TRUST_STORE_PASSWORD CONCAT
   ' -srckeystore ' CONCAT JAVA_TRUST_STORE CONCAT
   ' -destkeystore ' CONCAT JKS_TRUST_STORE CONCAT
   ' -srcstoretype JKS -deststoretype PKCS12 ' CONCAT 
   ' -deststorepass ' CONCAT JKS_TRUST_STORE_PASSWORD CONCAT ''')');


-- Step 3.  Create an SQL procedure that will call the QSYS/QYMKIMPK API to 
--          create a keystore from the PKCS12 keystore.  A SQL7909 warning from
--          this step can be ignored. 
CREATE OR REPLACE PROCEDURE ImportKeyStore(
     STOREPATH CHAR(100) CCSID 37, 
     STOREPATHLEN INT,  
     STOREFORMAT CHAR(9) CCSID 37, 
     STOREPASSWORD CHAR(100) CCSID 37,
     STOREPASSWORDLEN INT,   
     STOREPASSWORDCCSID INT,    
     IMPORTPATH CHAR(100) CCSID 37,     
     IMPORTPATHLEN INT,     
     IMPORTFORMAT CHAR(9) CCSID 37,  
     IMPORTVERSION CHAR(11) CCSID 37,   
     IMPORTPASSWORD CHAR(100) CCSID 37,   
     IMPORTPASSWORDLEN INT,     
     IMPORTPASSWORDCCSID INT,     
     ERRORCODE CHAR(100) FOR BIT DATA) 
    LANGUAGE C PARAMETER STYLE GENERAL EXTERNAL NAME 'QSYS/QYKMIMPK';

-- Step 4.  Call the SQL procedure to call the QSYS/QYKMIMPK API to 
--          create the new keystore to be used. 
CALL IMPORTKEYSTORE(
  STOREPATH => NEW_TRUST_STORE, 
  STOREPATHLEN => LENGTH(NEW_TRUST_STORE), 
  STOREFORMAT => 'OBJN0100',	            
  STOREPASSWORD => NEW_TRUST_STORE_PASSWORD, 
  STOREPASSWORDLEN => LENGTH(NEW_TRUST_STORE_PASSWORD), 
  STOREPASSWORDCCSID => 37, 
  IMPORTPATH => JKS_TRUST_STORE, 
  IMPORTPATHLEN => LENGTH(JKS_TRUST_STORE), 
  IMPORTFORMAT => 'OBJN0100', 
  IMPORTVERSION => '*PKCS12V3 ',
  IMPORTPASSWORD => JKS_TRUST_STORE_PASSWORD,
  IMPORTPASSWORDLEN => LENGTH(JKS_TRUST_STORE_PASSWORD), 
  IMPORTPASSWORDCCSID => 37, 
  ERRORCODE => X'00000000000000000000000000000000000000000000000000000000000000');

-- Use the new trust store to verify it works.
-- This step assumes that the system has a connection to the internet and that
-- a network firewall is not interposing its own TLS certificate on the connection.
values http_get(
   URL => 'https://www.ibm.com/support/pages/sites/default/files/inline-files/xmldoc.xml',  
   OPTIONS => '{"sslCertificateStoreFile":"' CONCAT NEW_TRUST_STORE CONCAT '"}'); 

-- Cleanup the schema 
DROP SCHEMA FROM_JAVA_TRUST_STORE;

一般錯誤

發生錯誤時,請使用函數的 VERBOSE 格式來取得錯誤的其他相關資訊。 這些函數會在 RESPONSE_MESSAGE 直欄中傳回錯誤資訊。 例如,下列呼叫將傳回找不到頁面的相關資訊錯誤。
SELECT * FROM TABLE(QSYS2.HTTP_GET_VERBOSE('http://www.w3.org/notfound.html','')); 
下列是使用 HTTP 函數時可能遇到的一些常見錯誤。
  • 如果現行系統沒有網際網路存取權,可能會發生下列錯誤。
    AXISC ERROR  : HTTPTransportException: Channel I/O operation timed
      out. Failed to open connection to server at host 192.168.1.233 and port 80. 
      Error is 3447 - A remote host did not respond within the timeout period.
  • 如果系統上未配置 DNS ,可能會發生下列錯誤。
    AXISC ERROR  : AxisTransportException: Cannot open a channel to the
      remote end. Failed to open connection to server at host XXXXX and port 80.
      Error is 3401 - Permission denied 
  • 如果正在使用 https ,則連線會使用 SSL。 為了適當地運作,伺服器必須使用 sslCertificateStoreFile 選項所指定之憑證儲存庫中的憑證管理中心所簽署的憑證。
    AXISC ERROR  : HTTPTransportException: Cannot initialize a channel
      to the remote end. Failed to establish SSL connection to server, the operation
      gsk_secure_soc_init() failed. GSKit Error is 6000 - Certificate is not signed 
      by a trusted certificate authority. 
  • 必須使用 basicAuth 選項來指定「HTTP 鑑別」。 嘗試在 URL 上使用基本鑑別 (例如 https://userid:password@example.com/login) 會導致下列錯誤。
     AXISC ERROR  : AxisTransportException: Cannot open a channel to the 
      remote end. Failed to open connection to server at host userid and port 0.
      Error is 3421 - Address not available.

除錯考量

您應該使用 IBM® i Access Client Solutions (ACS) 執行 SQL Script 來執行 HTTP 函數,以查看錯誤資訊。 使用 STRSQL 來呼叫 HTTP 函數將不會提供有用的問題資訊。

因為 HTTP 函數使用 AXISC 及 GSkit 所提供的網路功能,所以任何網路問題可能不會暴露至 SQL 層次,且具有足夠詳細資料來診斷問題。 如果 HTTP 函數失敗並產生 SQL4302 錯誤,且資訊沒有用, AXISC 追蹤可能會提供更多資訊。

如需啟用 AXISC 追蹤的相關資訊,請參閱 啟用 Web 服務用戶端的用戶端追蹤