変更の始まり

HTTP 関数の概要

SYSTOOLS の HTTP 関数は、Web サービスを公開または利用する HTTP 要求を行うために使用します。これらの関数により、SQL プログラマーは、SQL (組み込み SQL を含む) を介して Representational State Transfer (RESTful) を使用できます。

環境に関する考慮事項

HTTP 関数は Java で提供される機能を使用するため、Java 環境が現行ジョブで作成されます。これには、以下の条件が必要です。
  1. JVM がジョブで既に存在していてはなりません (Java ストアード・プロシージャー・サポートで作成された JVM を除く)。
  2. ジョブ CCSID を 65535 にすることはできません。
  3. PASE がインストールされていて、作動可能でなければなりません。CHKPRDOPT PRDID(5770SS1) OPTION(33) CL コマンドを使用して、PASE がインストールされていることを確認できます。

基本 HTTP 関数

基本関数の名前は、HTTP 要求の実行時に使用される 3 つのディメンションに従って付けられています。
  • 最初のディメンションは、HTTP 操作です。4 つの異なる HTTP 操作、つまり GET、PUT、POST、および DELETE があります。
  • 2 番目のディメンションは、データを返すために使用されるデータ・タイプです。2 つの選択肢 BLOB および CLOB があります。
  • 3 番目のディメンションは、関数の詳細バージョンを使用する必要があるかどうかです。非詳細関数は、スカラー関数です。VERBOSE 関数は、HTTP サーバーから送信された戻りのヘッダー情報を返すテーブル関数です。

関数の名前は、これらの 3 つのディメンションを反映したものです。例えば、HTTPGETCLOBVERBOSE は、最初のディメンションとして GET 操作、2 番目のディメンションとして CLOB データ・タイプ、3 番目のディメンションとして VERBOSE 設定を使用します。

以下の表では、3 つのディメンションに従って名前が付けられた 16 個の関数の要約を示します。
表 1. 基本 HTTP 関数
機能 説明 資料リンク
HTTPDELETEBLOB HTTP DELETE 要求を実行し、BLOB データを返します。 HTTPDELETEBLOB および HTTPDELETECLOB スカラー関数
HTTPDELETEBLOBVERBOSE HTTP DELETE 要求を実行し、BLOB データおよび応答ヘッダーを返します。 HTTPDELETEBLOBVERBOSE および HTTPDELETECLOBVERBOSE テーブル関数
HTTPDELETECLOB HTTP DELETE 要求を実行し、CLOB データを返します。 HTTPDELETEBLOB および HTTPDELETECLOB スカラー関数
HTTPDELETECLOBVERBOSE HTTP DELETE 要求を実行し、CLOB データおよび応答ヘッダーを返します。 HTTPDELETEBLOBVERBOSE および HTTPDELETECLOBVERBOSE テーブル関数
HTTPGETBLOB HTTP GET 要求を実行し、BLOB データを返します。 HTTPGETBLOB および HTTPGETCLOB スカラー関数
HTTPGETBLOBVERBOSE HTTP GET 要求を実行し、BLOB データおよび応答ヘッダーを返します。 HTTPGETBLOBVERBOSE および HTTPGETCLOBVERBOSE テーブル関数
HTTPGETCLOB HTTP GET 要求を実行し、CLOB データを返します。 HTTPGETBLOB および HTTPGETCLOB スカラー関数
HTTPGETCLOBVERBOSE HTTP GET 要求を実行し、CLOB データおよび応答ヘッダーを返します。 HTTPGETBLOBVERBOSE および HTTPGETCLOBVERBOSE テーブル関数
HTTPPOSTBLOB HTTP POST 要求を実行し、BLOB データを返します。 HTTPPOSTBLOB および HTTPPOSTCLOB スカラー関数
HTTPPOSTBLOBVERBOSE HTTP POST 要求を実行し、BLOB データおよび応答ヘッダーを返します。 HTTPPOSTBLOBVERBOSE および HTTPPOSTCLOBVERBOSE テーブル関数
HTTPPOSTCLOB HTTP POST 要求を実行し、CLOB データを返します。 HTTPPOSTBLOB および HTTPPOSTCLOB スカラー関数
HTTPPOSTCLOBVERBOSE HTTP POST 要求を実行し、CLOB データおよび応答ヘッダーを返します。 HTTPPOSTBLOBVERBOSE および HTTPPOSTCLOBVERBOSE テーブル関数
HTTPPUTBLOB HTTP PUT 要求を実行し、BLOB データを返します。 HTTPPUTBLOB および HTTPPUTCLOB スカラー関数
HTTPPUTBLOBVERBOSE HTTP PUT 要求を実行し、BLOB データおよび応答ヘッダーを返します。 HTTPPUTBLOBVERBOSE および HTTPPUTCLOBVERBOSE テーブル関数
HTTPPUTCLOB HTTP PUT 要求を実行し、CLOB データを返します。 HTTPPUTBLOB および HTTPPUTCLOB スカラー関数
HTTPPUTCLOBVERBOSE HTTP PUT 要求を実行し、CLOB データおよび応答ヘッダーを返します。 HTTPPUTBLOBVERBOSE および HTTPPUTCLOBVERBOSE テーブル関数

これらの HTTP 関数には、アクセスする HTTP サーバー、HTTP ヘッダーの設定、サーバーに送信する任意のデータを指定するパラメーターを渡します。最初の 2 つのパラメーターは、すべての HTTP 関数で同じです。

  • 第 1 パラメーターは、サーバーへのアクセスに使用する URL です。
  • 第 2 のパラメーターは、要求がサーバーに示す HTTP ヘッダーを指定する XML 文書です。この XML 文書は、CLOB または XML 値として指定できます。HTTP ヘッダー XML 文書の形式は、以下のとおりです。
    <httpHeader headerAttribute="headerAttributeValue">
       <header name="name" value="value" />
       <header name="Accept" value="text/plain,application/xml,*/*" />
    </httpHeader>

    XML ヘッダー文書は、後述する各種属性を持つ httpHeader 要素で構成されます。そして、httpHeader 要素には、追加の HTTP ヘッダーの設定に使用される header 要素が含まれます。これは、ヘッダーの名前とその名前に対応する値を指定することで行われます。

    httpHeader 要素では、以下の属性を設定できます。
    表 2. httpHeader 属性
    属性名 タイプ デフォルト 説明
    connectionTimeout 整数 SystemDefault タイムアウト (ミリ秒数)
    readTimeout 整数 SystemDefault タイムアウト (ミリ秒数)
    followRedirects ブール true true の場合、リダイレクトに従います。
    useCaches ブール true true の場合、キャッシュが使用されます。
    includeErrorMsg ブール false true の場合、HTTP 詳細関数により、RESPONSEMSG 列でエラー情報が返されます。

    header 要素により、各種 HTTP ヘッダーを設定できます。ヘッダー名「Content-Type」、「Content-Length」、「Content-Encoding」、「Accept-Encoding」、「Authorization」、「User-Agent」では、大/小文字は区別されません。残りのヘッダーは、指定したとおりに送信されます。

    例えば、以下のヘッダーを使用した場合を考えます。
    <httpHeader><header name="User-Agent" value="IBM i HTTP function"/></httpHeader>
    これにより、サーバーに送信される HTTP ヘッダーに "User-Agent": "IBM i HTTP function" が含まれることになります。

一般 HTTP 関数

HTTPBLOB 関数および HTTPCLOB 関数を使用し、実行する操作 (GET、PUT、POST、または DELETE) を引数として渡して、非詳細 HTTP 関数のいずれかを実行できます。
表 3. HTTP 一般関数
機能 説明 資料リンク
HTTPBLOB HTTP 要求を実行し、BLOB データを返します。 HTTPBLOB および HTTPCLOB スカラー関数
HTTPCLOB HTTP 要求を実行し、CLOB データを返します。 HTTPBLOB および HTTPCLOB スカラー関数

ユーティリティー HTTP 関数

追加の HTTP 関数として、HTTP 要求を処理するためのユーティリティー関数があります。
表 4. HTTP ユーティリティー関数
機能 説明 資料リンク
BASE64DECODE Base64 デコードされたビット・データ・ストリングを返します。 BASE64DECODE スカラー関数
BASE64ENCODE 文字ストリングの Base64 エンコードされたバージョンを返します。 BASE64ENCODE スカラー関数
HTTPHEAD HTTP HEAD 要求を使用して HTTP ヘッダーを検証します。 HTTPHEAD スカラー関数
URLDECODE URL エンコードされたストリングをデコードします。 URLDECODE スカラー関数
URLENCODE URL エンコードを使用してストリングをエンコードします。 URLENCODE スカラー関数

一般的なエラー

以下に、HTTP 関数の使用時に発生することがある一般的なエラーを示します。
  • 現行システムにインターネット・アクセスがない場合、以下のエラーが発生することがあります。

    [SQL4302] Java stored procedure or user-defined function SYSTOOLS.HTTPGETCLOB, specific name HTTPG00005 aborted with an exception "java.net.ConnectException:A remote host refused an attempted connect operation. (Connection refused)".

  • システムで DNS が構成されていない場合、以下のエラーが発生することがあります。

    [SQL4302] Java stored procedure or user-defined function SYSTOOLS.HTTPGETCLOB, specific name HTTPG00005 aborted with an exception "java.net.UnknownHostException"

  • ジョブ CCSID が 65535 の場合、以下のエラーが発生することがあります。

    [SQL0332] Character conversion between CCSID 65535 and CCSID 1200 not valid.

  • https が使用されている場合、接続では SSL が使用されます。正常に動作するには、認識される認証局によって署名された証明書をサーバーが使用する必要があります。自己署名証明書を使用すると、以下のエラーが発生することがあります。

    [SQL4302] Java stored procedure or user-defined function SYSTOOLS.HTTPGETCLOB, specific name HTTPG00005 aborted with an exception "com.ibm.jsse2.util.h: PKIX path building failed: java.security.cert.CertPathBuilderException: PKIXCertPathBuilderImpl could not build a valid CertPath.

    自己署名証明書を使用するサーバーにアクセスする必要がある場合は、使用される JVM のトラストストアに証明書を追加する必要があります。現行の JVM が 32 ビットの JDK 6 である場合、サーバーから証明書をダウンロードした後に、QSH で以下のコマンドを使用できます。
    keytool -import -trustcacerts 
      -keystore /QOpenSys/QIBM/ProdData/JavaVM/jdk60/32bit/jre/lib/security/cacerts  
      -storepass changeit -noprompt -alias myhost -file myhost.crt
  • 一部の Web サイトでは、特定の SSL バージョンを使用する必要があります。その場合、以下のようなエラーが発生することがあります。

    [SQL4302] Java stored procedure or user-defined function SYSTOOLS.HTTPGETCLOBVERBOSE, specific name HTTPG00007 aborted with an exception "Received fatal alert: handshake_failure".

    特定の SSL バージョンの使用を強制するために、以下を行うことができます。
    1. JVM プロパティーを設定するユーザー定義関数を作成します。これは、システムごとに 1 回実行するだけで構いません。
      CREATE FUNCTION SYSTOOLS.setProperty(PROPERTY VARCHAR(80), VALUE VARCHAR(80)) 
         RETURNS VARCHAR(80) 
         LANGUAGE JAVA 
         PARAMETER STYLE JAVA 
         EXTERNAL NAME 'java.lang.System.setProperty'
    2. ジョブで HTTP 関数を呼び出す前に、以下を使用してデフォルト SSL プロトコルを設定します。
      VALUES SYSTOOLS.setproperty('com.ibm.jsse2.overrideDefaultProtocol','TLSv12')

デバッグに関する考慮事項

STRSQL を使用して HTTP 関数を呼び出すと、有用な問題情報が得られません。エラー情報を確認するには、代わりに ACS Run SQL Scripts を使用して HTTP 関数を実行する必要があります。

HTTP 関数は Java で提供されているネットワーキング関数を使用するため、Java コードで検出されたネットワーキングの問題が SQL レベルで公開されず、問題を診断するために十分な詳細が得られないことがあります。HTTP 関数が SQL4302 エラーで失敗し、情報が有用でない場合は、例外に関する詳細情報を確認するために、Java ストアード・プロシージャー・トレースを使用できます。

Java ストアード・プロシージャー・トレースは、以下の SQL ステートメントを使用することで実行および表示できます。
  • トレースを有効にします。
    CALL QSYS2.QCMDEXC('ADDENVVAR ENVVAR(QIBM_COMPONENT_TRACE_LEVEL) 
                                 VALUE(''SQJAVA,VERBOSE'')')
  • HTTP 関数を実行します。
  • QTEMP のファイルにトレースをダンプします。
    CALL QSYS2.QCMDEXC('DMPUSRTRC')
  • トレースを現行ライブラリーにコピーします。
    CREATE TABLE MYTRACE AS 
      (SELECT TRIM(CAST(QAP0ZDMP AS VARCHAR(200) CCSID 37)) LINE FROM QTEMP.QAP0ZDMP ) 
      WITH DATA
  • トレースの Java 例外を表示します。
    SELECT * FROM MYTRACE
       WHERE LINE LIKE '% at %' OR LINE LIKE '%Except%' 
変更の終わり