HTTPリクエスト
HTTPリクエストは、URLからWebサーバに対してコンテンツを要求することができます。Webサーバからテキストデータをダウンロードすることができ、セカンドライフの外の世界から情報を引き寄せることができます。また、任意のパラメータでデータを送信することも可能です。
HTTPリクエストにはllHTTPRequest関数を使います。この関数が実行された時点でLSLが実行されているサーバから指定されているURLに対してHTTPリクエストが送信されます。
key llHTTPRequest(string url, list parameters, string body)
urlには取得するコンテンツのURLを指定します。paramatersには、HTTPリクエストに関するいくつかの設定を表すlist型の値を指定します。このlist型は、設定する項目を表すHTTP_で始まる定数と値の組み合わせを指定します。最後のbodyには、送信するデータ本体を表します。
parametersに指定する値は、次の表ような項目と値の組み合わせになります。
| 項目定数 | デフォルト値 | 意味 |
| HTTP_METHOD | "GET" | HTTPリクエストメソッドを表します。"GET"、"PUT"、"POST"、"DELETE"のいずれかを指定します。 |
| HTTP_MIMTYPE | "text/plain;charset=utf-8" | 送信するテキストのMIME型を指定します。HTMLフォームによるPOSTメソッドを再現する場合は"application/x-www-form-urlencoded"を指定します。 |
| HTTP_VERIFY_CERT | TRUE | TRUEの場合、HTTPSを要求するとき標準認証局のうちの1つを使用して証明できなければなりません。そうでなければ、どんなサーバSLL証明書も受け入れます。 |
例えば、HTTPメソッドの種類をPOSTで送りたい場合は<HTTP_METHOD, "POST">となります。複数の項目を設定する場合は<項目的数, 値, 項目的数, 値 ...>という形になります。
この関数によるHTTPリクエストは非同期に行われます。そのため、Webサーバへの通信や応答を待たずに関数は制御を返します。Webサーバが結果を返すとhttp_responseイベントハンドラが呼び出されます。
http_response(key request_id,
integer status,
list metadata,
string body)
複数のリクエストを送信している場合、llHTTPRequest関数の戻り値とhttp_responseイベントハンドラのrequest_idパラメータを比較することで、どの要求に対する応答なのかを判断できます。statusにはHTTP応答コードが格納されています。通信が成功したかどうかを、この値から調べることができます。
metadataは<キー, 値>の組み合わせのlist型です。現在は、HTTP_BODY_TRUNCATEDというキーのみがサポートされています。この値は、取得したデータ本体が容量オーバーによって切り取られたバイト数を値として格納します。bodyパラメータには、サーバから取得した結果が格納されています。サーバからの結果は2049KB以内のテキストでなければなりません。
ただし、サーバからの結果を得ることができてもセカンドライフはHTMLをレンダリングする機能を持ちません。DOMも実装されていないためXMLを処理することもできません。唯一の方法は生の文字列型として処理することですが、簡素な構造のHTMLやXMLが限界でしょう。容量の制限からも、複雑な構造のデータをLSLで処理するのは困難です。
そこで、LSLとWebが連携するためにセカンドライフ用のWebサービスを構築するとLSL側の負担が軽減されます。複雑なデータ処理はWebで行い、LSLではその結果だけを取得するようにします。
例として「はじめてのWebサービス実装体験」で作成した辞書サービスをベースに、セカンドライフの世界で辞書ツールを作成する方法を考えてみます。多くの項目を持つ辞書にはデータベースが必要となりますが、Webサービスを中継することで間接的にデータベースを利用することができ、大規模なデータを扱えるようになります。また、Webサービスが最新のデータの更新されれば、同時にセカンドライフの世界にも自動的に最新の情報がもたらされることになります。
string URL = "http://your-domain/"; default { state_entry() { key owner = llGetOwner(); llListen(0, "", owner, ""); } listen(integer channel, string name, key id, string msg) { string query = "?key=" + msg; llOwnerSay("Loading..."); llHTTPRequest(URL + query, [], ""); } http_response(key request_id, integer status, list metadata, string body) { if (status != 200) { llOwnerSay("Error:status=" + (string)status); } else llOwnerSay(body); } }

コード01は、オブジェクトの所有者がチャットにテキストを出力すると、オブジェクトのlistenイベントでテキスト拾ってWebサービスに問い合わせるというプログラムです。URL変数に代入する文字列は、サービスを配置している適切なアドレスに変更してください。
例では、セカンドライフ用に実装された簡単な辞書サービスにアクセスし、その結果を表示しています。URLクエリから辞書で検索する単語を指定し、Webサービスは与えられた単語に対応している結果を返します。
本稿において、Webサービス側の実装は重要ではありません。重要なのは、このような仕組みを採用することで、Webの情報をセカンドライフの世界にもたらすことができる、という点です。Webサービスがデータベースを利用していれば、LSLから間接的にデータベースを操作することも可能です。
