プログラミング・ガイド

     前  次    新規ウィンドウで目次を開く  新規ウィンドウで索引を開く  PDFとして表示 - 新規ウィンドウ  Adobe Readerを取得 - 新規ウィンドウ
コンテンツはここから始まります

Webアプリケーション・サーバーのプログラミング

この項には、以下のトピックが含まれています。

 


概要

Oracle SALTには、WebアプリケーションをOracle Tuxedo内で実行し、HTTPサーバー・プラグインによって簡単にアクセスできるようにする機能があります。Apache 2、Oracle HTTP ServerおよびiPlanetなどのHTTPサーバーを使用することで、アプリケーションをワールド・ワイド・ウェブに直接公開できます。HTTPサーバーはOracle Tuxedo固有のプラグイン(mod_tuxedoと呼ばれる)を使用する必要があり、このプラグインはHTTPリクエストをOracle Tuxedoリクエストに変換し、Oracle TuxedoレスポンスをHTTPレスポンスに変換します。

アプリケーションを記述するには、CGIと同様ですがOracle Tuxedoサーバーおよびその通信モードに固有のGatewayインタフェースをCまたはC++で使用するか、PHP、PythonおよびRubyなどの動的言語を使用します。動的言語を使用すると、プログラムではOracle Tuxedoで実行中であることは認識されないため、Symfony (PHP)、Django (Python)またはRails (Ruby)などのアプリケーション・フレームワークをOracle Tuxedoベースの環境で直接、再利用できます。

 


ネイティブOracle Tuxedo Webアプリケーションの開発

mod_tuxedoはWebリクエスト処理のOracle Tuxedoにおけるクライアント部分を提供しますが、Oracle Tuxedo側でリクエストを処理するメソッドの1つはそのリクエストに直接アクセスすることです。これは受信したバッファ、つまりOracle Tuxedo FML32型付きバッファの形式を記述することで可能になります。

このメソッドでは、Oracle Tuxedoサービスを開発することで動的HTTPコンテンツを生成し、その段階でOracle Tuxedo RASPおよび統合機能を利用できます。

HTTPリクエストの関連要素(メソッド名、問合せ文字列のURL、ファイル名、POSTデータなど)が、mod_tuxedo (HTTPレスポンス・ヘッダー(必要な場合)、HTMLドキュメント)への戻りデータと同様に、公開されます。

詳細は、『Oracle SALTリファレンス・ガイド』の付録H「Oracle SALT HTTP FML32バッファ形式」を参照してください。

開発プロセスは、HTMLコードを生成する通常のOracle Tuxedoサービスの開発と同様ですが、異なる点はRESTfulサービスの開発が、サービスの動作を制御する一連の規則またはルールに準拠するということです(GETを処理するサービスはPUTの処理時と異なる動作をします)。RESTfulサービスは一般的に、HTMLブラウザを使用してアクセスできるように設計されていません(つまり、SOAPサービスと同様です)。

データ・フローは次のようになります。

各種のコンポーネントをリスト4-1からリスト4-4まで示します。

リスト4-1 OHSまたはApache2の構成(httpd.conf引用)
<Location "/ACCOUNT">
    <IfModule mod_tuxedo.c>
        SetHandler tuxedo-script
        Tuxconfig "/home/maurice/src/tests/secsapp/work/tuxconfig"
    </IfModule>
</Location>

Oracle Tuxedoサービスをリスト4-2に示されているとおりに記述します。

リスト4-2 Oracle Tuxedoサービス
void
ACCOUNT(TPSVCINFO *rqst)
{
    char val[1024]; /* TODO: query size first */
    long len;
    int rc;
    /* Fetch PATH_INFO value, which contains the resource */
    len = sizeof(val);
    rc = Fget32((FBFR32 *)inbuf, PATH_INFO, 0, (char *)val, &len);
    if (rc < 0) {
        /* Handle error */
    }
    /* Variable 'val' contains resource name, process it */
    ...
    /* Fetch QUERY_STRING, which optionally contains 
       additional parameters */
    len = sizeof(val);
    rc = Fget32((FBFR32 *)inbuf, QUERY_STRING, 0, (char *)val, &len);
    if (rc < 0) {
        /* Handle error */
    }
    /* Depending on method, do processing */
    len = sizeof(val);
    rc = Fget32((FBFR32 *)inbuf, REQUEST_METHOD, 0, (char *)val, &len);
    if (rc < 0) {
        /* Handle error */
    }
    if (strcmp(val, "GET") == 0) {
        ...
    } else if (strcmp(val, "PUT") == 0) {
        ...
    } else if (strcmp(val, "POST") == 0) {
       /* Get POST_DATA, parse it */
        ...
    } else if (strcmp(val, "DELETE") == 0) {
        ...
    }
    /* Compose return document, using xml or JSON */
    ...
    /* Return result document */
    tpreturn(TPSUCCESS, 0, result, 0L, 0);
}

URL/レスポンスの例:

メソッド: GET

リクエストURL: http://myhost/ACCOUNT/1234

リスト4-3に示されているレスポンス(XML)。

注: XML生成は既存のlibtxmlを使用して実行できます。
リスト4-3 XMLレスポンス
<account id="1234">
    <balance value="10000"/>
    <customer name="John Smith"/>
</account>

リスト4-4に示されているレスポンス(JSON)。

注: JSONの生成はJSON-Cを使用して実行できます。JSON-Cは無償で再配布可能なCでのJSON実装(MITライセンス)で、ソース・コードとして提供されています。多くのライブラリが多数の言語(PHP、Perl、Python、Ruby、Javaなどを含む)に存在します。
リスト4-4 JSONレスポンス
[
    "account": {
        "id": "1234",
        "balance": {
            "value": "10000"
         },
         "customer": {
            "name": "John Smith"
         }
    }
]

 


Python Webアプリケーションの開発

WEBHNDLR Oracle Tuxedoシステム・サーバー内でのPHPアプリケーションの実行方法と同様に、Oracle SALTではWeb用のアプリケーションをPythonで記述できます。PHP (すべてのスクリプトがCGI同様のモデルで実行するように設計されています)とは異なり、Pythonでは特定のWebレイヤーを使用した実行が必要です。

このレイヤーはWSGI (Web Server Gateway Interface)として示され、言語に組み込まれます。これは事実上のPython仕様(PEP 333)です。Pythonでは、アプリケーションがWSGIに対して記述されますが、完全なアプリケーション・フレームワークが使用可能です(WSGIに準拠。Djangoが最も一般的である傾向があります)。

次の項では、Python WSGIアプリケーション(Djangoフレームワークの使用を含む)を実行するためにWEBHNDLRを構成する方法について説明します。

前提条件

使用方法

簡単なWSGIアプリケーションの例をリスト4-5に示します。

リスト4-5 WSGIアプリケーションの例
import cgi
def application(environ, start_response):
    form = cgi.FieldStorage(fp=environ['wsgi.input'],
                            environ=environ,
                            keep_blank_values=1)
    write = start_response('200 OK', [('Content-type', 'text/html')])
    if form.getvalue('name'):
        write('<html><head><title>Hello!</title></head>\n')
        write('<body>\n')
        write('<h1>Hello %s!</h1>\n' % form['name'].value)
    else:
        write('<html><head><title>Who is there?</title></head>\n')
        write('<body>\n')
        write('<h1>Who is there?</h1>\n')
    write('<form action="%s" method="POST">\n' % environ['SCRIPT_NAME'])
    write('What is your name?<br>\n')
    write('<input type="text" name="name" value="%s"><br>\n'
          % cgi.escape(form.getvalue('name', ''), 1))
    write('<input type="submit" value="That is my name"></form>\n')
    write('</body></html>\n')
    return None

Djangoなどのフレームワークでは、これはハンドラ・スクリプトで実行されます。このスクリプトはアプリケーション開発者には表示されません。

あらゆるPython WSGIアプリケーションは、次の手順に従ってWEBHNDLRシステム・サーバー内で実行される可能性があります。

  1. Apache (またはOHS)を構成してリクエストをWEBHNDLRに転送します。必要とされる静的ファイル(例: 画像、CSSスタイルシートまたはjavascriptファイル)へのパスを示すために、追加的な構成が必要になる場合があります。
  2. アプリケーション・パスをPYTHONPATH環境変数に追加します。
  3. WEBHNDLRに対するAPP_CONFIGを設定して、アプリケーションまたはミドルウェア・ハンドラをロードします(Djangoなどのフレームワークが対象)。

詳細は、『Oracle SALTリファレンス・ガイド』のWEBHNDLR(5)に関する項を参照してください。

スタンドアロン・スクリプト/アプリケーション

リスト4-6に、WSGIアプリケーションのためのApache構成の例を示します。

リスト4-6 スタンドアロン・スクリプト/アプリケーションの例
<VirtualHost 10.143.7.223:2280>
DocumentRoot "/media/src/tests"
<Directory "/media/src/tests">
<IfModule mod_tuxedo.c>
    SetHandler tuxedo-script
    Tuxconfig "/media/src/TUX11g/web/tests/tuxconfig"
    TuxService PYWEB
</IfModule>
</Directory>
</VirtualHost>

スタンドアロンWSGIアプリケーションのためのubbconfigファイルおよび設定は、test_app.py (==module)という名前のスクリプト内にあり、これは/media/src/testsディレクトリ内にあります(PYTHONPATHには /media/src/testsが含まれる必要があります)。

WEBHNDLR SRVGRP=PHPGRP SRVID=1 MIN=5 MAX=8
   CLOPT="-A -- -l Python -S PYWEB "

WEBHNDLRを起動する前に次のいずれかを実行してください。

Djangoベースのアプリケーション

Apache Djangoベースのアプリケーションについては、RewriteEngineルールとAliasに注意する必要があります。これらは、リスト4-7に示すように、静的ファイル(例: CSS、画像またはjavascript)の場所を示し、ルートURLをアプリケーションにマップ(最後のRewriteRuleを参照)するために存在します。

リスト4-7 Djangoベースのアプリケーション
<VirtualHost 10.143.7.223:2280>
DocumentRoot "/media/src/test_django/mysite"
Alias /media /usr/lib/python2.5/site-packages/django/contrib/admin/media
<Directory "/media/src/test_django/mysite">
    <IfModule mod_tuxedo.c>
        SetHandler tuxedo-script
        Tuxconfig "/media/src/TUX11g/web/tests/tuxconfig"
        TuxService PYWEB
    </IfModule>
</Directory>
    RewriteEngine On
    RewriteRule ^/(media.*)$ /$1 [QSA,L,PT]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^/(.*)$ /mysite/$1 [QSA,L]
</VirtualHost>

環境変数DJANGO_SETTINGS_MODULEは、WEBHNDLRを起動する前に設定する必要があります。たとえば、mysiteというアプリケーションでは次のようになります。

DJANGO_SETTINGS_MODULE=mysite.settings

Djangoの例のためのPYTHONPATH 設定は、mysiteと呼ばれ、/media/src/test_djangoディレクトリ内に存在します。

PYTHONPATH=/media/src/test_django

Djangoの例のためのubbconfig設定はここで記述されています。

WEBHNDLR SRVGRP=PHPGRP SRVID=1 MIN=5 MAX=8

CLOPT="-A -- -l Python -S PYWEB"

WEBHNDLRを起動する前に次のいずれかを実行してください。

 


Ruby Webアプリケーションの開発

WEBHNDLR Oracle Tuxedoシステム・サーバー内でのPHPアプリケーションの実行方法と同様に、Oracle SALTではWeb用のアプリケーションをRubyで記述できます。PHP (すべてのスクリプトがCGI同様のモデルで実行するように設計されています)とは異なり、Rubyでは特定のWebレイヤーを使用した実行が必要です。

WSGIに相当するもの(Rackと呼ばれます)が存在しますが、これは別個にインストールされるライブラリの形式で実行されます。Rubyでは、アプリケーションがRackの最上部に直接記述される場合がありますが、Railsなどの完全なアプリケーション・フレームワークが使用可能です。Rackアプリケーションは、Rubyに対するアプリケーションおよびサーバー間のインタフェースです(WSGIと同様)。これは通常、言語へのアドオンとしてインストールされ、Railsなどのアプリケーション・サーバー環境に対する前提条件となります。次の項では、Ruby Rack準拠のアプリケーション(Railsフレームワークの使用を含む)を実行するためにWEBHNDLRを構成する方法について説明します。

前提条件

使用方法

リスト4-8では、簡単なRackアプリケーションの例を示します。

リスト4-8 簡単なRackアプリケーションの例
class HelloWorld
  def call(env)
    [200, {"Content-Type" => "text/plain"}, ["Hello world!"]]
  end
end

Rubyなどのフレームワークでは、これはハンドラ・スクリプトで実行され、アプリケーション開発者には表示されません。

リスト4-8内のスクリプトはRackUpスクリプトを使用してハンドラに渡されます。RackUpスクリプトではさらに機能性(かなりの例外、LINTラッパーなど)をアプリケーションに追加できます。

アプリケーションをロードしているRackUpスクリプトの例をリスト4-9に示します。

リスト4-9 RackUpスクリプトの例
require 'hello'
use Rack::ShowExceptions
run HelloWorld.new

あらゆるRuby Rack準拠のアプリケーションは、次の手順に従ってWEBHNDLRシステム・サーバー内で実行される可能性があります。

  1. Apache (またはOHS)を構成してリクエストをWEBHNDLRに転送します。必要とされる静的ファイル(例: CSSスタイルシートまたはjavascriptファイル)へのパスを示すために、追加的な構成が必要になる場合があります。
  2. WEBHNDLRを構成して、アプリケーションまたはミドルウェア・ハンドラをロードします(Railsなどのフレームワークが対象)。

Ruby Rack Lobster

リスト4-10に、Apache (またはOHS)の構成の例を示します。

リスト4-10 Apache (またはOHS)の構成の例
<VirtualHost 10.143.7.223:2380>
    DocumentRoot "/media/src/tests"
    <Directory "/media/src/tests">
        <IfModule mod_tuxedo.c>
            SetHandler tuxedo-script
            Tuxconfig "/media/src/TUX11g/web/tests/tuxconfig"
            TuxService RBWEB
        </IfModule>
    </Directory>
</VirtualHost>

ubbconfigファイルのWEBHNDLR設定は次のとおりです。

WEBHNDLR SRVGRP=PHPGRP SRVID=1 MIN=5 MAX=8

CLOPT="-A -- -l Ruby -S RBWEB"

APP_CONFIGを設定します。

Ruby Railsアプリケーション

Apache (またはOHS)構成については、RewriteEngineルールおよび(SetHandlerとは反対に)AddHandlerディレクティブに注意する必要があります。これらは、リスト4-11に示すように、HTTPサーバーを静的ファイル(CSS、画像、javascriptなど)にリダイレクトするために存在します。

リスト4-11 Ruby Railsアプリケーション
<VirtualHost 10.143.7.223:2380>
SetEnv RAILS_RELATIVE_URL_ROOT /media/src/rails_test
DocumentRoot "/media/src/rails_test/public"
RewriteEngine On
RewriteRule ^(/stylesheets/.*)$ - [L]
RewriteRule ^(/javascripts/.*)$ - [L]
RewriteRule ^(/images/.*)$ - [L]
RewriteRule ^$ index.html [QSA]
RewriteRule ^([^.]+)$ $1.html [QSA]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^/(.*)$ /rails3.tuxrb [QSA,L]
<Directory "/media/src/rails_test/public">
Allow from All
<IfModule mod_tuxedo.c>
    AddHandler tuxedo-script .tuxrb
    Tuxconfig "/media/src/TUX11g/web/tests/tuxconfig"
    TuxService RBWEB
</IfModule>
</Directory>
</VirtualHost>

ubbconfigファイルのWEBHNDLR設定(Railsアプリケーションが/media/src/rails_testディレクトリで設定され、RailsTestと名付けられていることが前提)は、次のようになります。

WEBHNDLR SRVGRP=PHPGRP SRVID=1 MIN=5 MAX=8

CLOPT="-A -- -l Ruby -S RBWEB'. That is, remove the "-a /media..." portion

WEBHNDLRを起動する前に次のいずれかを実行してください。

 


PHP Webアプリケーションの開発

PHPスクリプトはWEBHNDLRで直接サポートされているため、アプリケーションをOracle Tuxedo環境で実行するための変更は特に必要ありません。HTTPサーバーにおけるPHPスクリプトの場所の変更だけで十分です。WEBHNDLRでPHPスクリプトを実行するようにフレームワークが一度設定されると、PHPアプリケーションは自動的にサポートされます。

詳細は、Oracle SALTコマンド・リファレンス・ガイドのWEBHNDLR(5)に関する項を参照してください。

前提条件

使用方法

前提条件

使用方法

PHPスクリプトはWEBHNDLRで直接サポートされているため、アプリケーションをOracle Tuxedo環境で実行するための変更は特に必要ありません。HTTPサーバーにおけるPHPスクリプトの場所の変更だけで十分です。WEBHNDLRでPHPスクリプトを実行するようにフレームワークが一度設定されると、PHPアプリケーションは自動的にサポートされます。

(リスト4-12に示されている)"test.php"というスクリプトを、HTTPサーバーのドキュメント・ルート・フォルダ内に配置します。

リスト4-12 test. phpスクリプト
-- listing x-x test.php script
<?php
phpinfo();
?>
--

ブラウザで次の場所を指定します。http://<your_host>:<port>/test.php

 


関連項目


  先頭に戻る       前  次