HTTP 関数の概要

これらの HTTP 機能を使用して、 Web サービスを使用する HTTP 要求を作成します。 これらの関数により、SQL プログラマーは、SQL (組み込み SQL を含む) を介して Representational State Transfer (RESTful) を使用できます。 これらは、 JVMを作成するオーバーヘッドなしに、 SYSTOOLS HTTP 関数と同じ機能を提供します。 これらの関数は、 ILE サポートのために統合 Web サービス (IWS) クライアントの一部である HTTP トランスポート API を使用します。

HTTP 機能を使用するには、 5770SS1 オプション 3 (拡張基本ディレクトリー・サポート) および 5770SS1 オプション 34 (Digital Certificate Manager) がシステムにインストールされている必要があります。

これらの HTTP 関数は QSYS2 に存在し、 SYSTOOLS HTTP 関数よりもオーバーヘッドが少ない。 QSYS2 HTTP 機能の追加の利点は、 HTTP 認証、プロキシー・サポート、構成可能なリダイレクトの試行、および構成可能な SSL オプションです。

URL パラメーターは、 http: および https: URLをサポートします。 https: URL は、セキュア通信チャネルを介してネットワーク通信が行われる必要があることを示します。 https 要求は、 TLS (トランスポート層セキュリティー) を使用してセキュア・チャネルを作成します。 このセキュア・チャネルは、送信されたデータをすべて暗号化し、中間者攻撃を防止します。 セキュア情報を含む通信は、 httpの代わりに https を使用する必要があります。 ユーザー ID およびパスワードの機密性のために、 HTTP 認証は http URLには許可されません。

HTTP サービスは、 QSYS/QSQAXISC サービス・プログラムを使用して実装されます。 システム管理者は、 QSYS/QSQAXISC サービス・プログラムの権限を変更することによって、 HTTP サービスへのアクセスを無効にすることができます。 QSYS/QSQAXISC サービス・プログラムに関連した権限は , すべての HTTP 機能に適用されます。

基本 HTTP 関数

基本関数は、 HTTP リクエストを行うときに使用される 3 つの次元に応じて名前が付けられます。
  • 最初のディメンションは、HTTP 操作です。 HTTP :GET、PUT、POST、 PATCH、DELETEである。
  • つ目の次元は、データの送受信に使われるデータ型である。 選択肢は2つある:BLOBとCLOBの暗黙値である。
  • 3 番目のディメンションは、関数の詳細バージョンを使用する必要があるかどうかを示します。 非詳細関数はスカラー関数です。 冗長関数は、 HTTP サーバーから送信される戻りヘッダー情報を含む単一行を戻す表関数です。 ヘッダー情報は JSON形式でフォーマットされます。

関数の名前は、これらの寸法を反映します。 例えば、HTTP_GET_VERBOSE は、最初のディメンションからの GET 操作、2 番目のディメンションからの CLOB データ・タイプ、および 3 番目のディメンションからの VERBOSE 設定を使用します。

以下の表は、関数の要約です。
表 1. 基本 HTTP 関数
関数 説明 資料リンク
HTTP_DELETE HTTP DELETE 要求を行い、 CLOB データを返します。 HTTP_DELETE および HTTP_DELETE_BLOB スカラー関数
http_delete_blob 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_PATCH HTTP PATCH リクエストを行い、CLOB データを返す。 HTTP_PATCH および HTTP_PATCH_BLOB スカラ関数
http_patch_blob HTTP PATCH リクエストを行い、BLOB データを返す。 HTTP_PATCH および HTTP_PATCH_BLOB スカラ関数
http_patch_blob_verbose HTTP PATCHリクエストを行い、BLOBデータとレスポンスヘッダを返す。 HTTP_PATCH_VERBOSE および HTTP_PATCH_BLOB_VERBOSE テーブル関数
http_patch_verbose HTTP PATCHリクエストを行い、CLOBデータとレスポンスヘッダを返す。 HTTP_PATCH_VERBOSE および HTTP_PATCH_BLOB_VERBOSE テーブル関数
HTTP_POST HTTP POST 要求を行い、 CLOB データを返します。 HTTP_POST および HTTP_POST_BLOB スカラー関数
HTTP_POST_BLOB HTTP POST リクエストを行い、BLOB データを返す。 HTTP_POST および HTTP_POST_BLOB スカラー関数
http_post_blob_verbose HTTP POSTリクエストを行い、BLOBデータとレスポンスヘッダを返す。 HTTP_POST_VERBOSE および HTTP_POST_BLOB_VERBOSE 表関数
HTTP_POST_VERBOSE 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_PUT_VERBOSE HTTP PUT 要求を行い、 CLOB データおよび応答ヘッダーを返します。 HTTP_PUT_VERBOSE および HTTP_PUT_BLOB_VERBOSE 表関数
これらの HTTP 関数には、アクセスする HTTP サーバー、HTTP ヘッダーの設定、サーバーに送信する任意のデータを指定するパラメーターを渡します。 各パラメーターは、 HTTP 関数で同様である。
  • 第 1 パラメーターは、サーバーへのアクセスに使用する 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 トラストストアを使用します。 このスクリプトは、より新しい Java トラストストアを使用するように変更できます。 このスクリプトは、 5770SS1 オプション 30 を必要とする Qshellも使用します。 このスクリプトは、Java トラストストアがユーザーによって変更されていないことを前提としています。 変更されている場合は、それらの変更に適合するようにスクリプトを変更する必要があります。

この例では、 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. 
  • http 認証は basicAuth オプションを使用して指定する必要があります。 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) Run SQL Scripts を使用して、 HTTP 関数を実行する必要があります。 STRSQL を使用して HTTP 関数を呼び出すと、有用な問題情報が得られません。

HTTP 関数は、 AXISC および GSkit によって提供されるネットワーキング機能を使用するため、ネットワークの問題は、問題を診断するために十分な詳細情報を持つ SQL レベルに公開されないことがあります。 HTTP 関数が SQL4302 エラーで失敗し、情報が有益でない場合は、 AXISC トレースで詳細情報が提供されることがあります。

AXISC トレースの使用可能化に関する情報は、 Web サービス・クライアントのクライアント・トレースの使用可能化で確認できます。