LlHTTPRequest/ja

From Second Life Wiki
Jump to navigation Jump to search

要約

関数: key llHTTPRequest( string url, list parameters, string body );

指定したURL、リクエストの本体とパラメータでHTTPリクエストを送信します。
HTTPリクエストが作成した識別のハンドルを key で返します。

• string url 有効なHTTP/HTTPS URL
• list parameters HTTP_*フラグ値の組み合わせで指定された、設定パラメータ

[ parameter1, value1, parameter2, value2, . . . parameterN, valueN]

• string body リクエストのコンテンツ。

フラグ 値の型 初期値 説明
HTTP_METHOD 0 string "GET" 'GET', 'POST', 'PUT' と 'DELETE'
HTTP_MIMETYPE 1 string "text/plain;charset=utf-8" text/* MIME タイプでは charset を指定しなければなりません。HTML フォームをエミュレートできるようにするために、 application/x-www-form-urlencoded を使用しましょう。これによって、適切にエスケープ (llEscapeURL) されたフォーム var=value&var2=value2 の中の <name,value> ペアのシーケンス文字列に body を設定して、 Web フレームワークで自動的に解析できるようにすることができます。
HTTP_BODY_MAXLENGTH 2 integer 2048 UTF-8でエンコードされたHTTPボディの最大バイト長を設定します。最大値はVMに依存します。
  • Mono 最大: 16384
  • LSO 最大: 4096
HTTP_VERIFY_CERT 3 integer boolean TRUE TRUE の場合、サーバ SSL 認証は、HTTPS リクエストを作成する時点で標準的な認証機関のどれかを用いて認証できる状態になっていなければなりません。 FALSE の場合は、すべてのサーバ SSL 認証は無条件に受け入れられます。
HTTP_VERBOSE_THROTTLE 4 integer TRUE TRUEならサーバーに送られてくるリクエストの速度が制限値を超えた場合、 DEBUG_CHANNELでメッセージが叫ばれます。FALSEならエラーメッセージを出しません。(llHTTPRequestは黙ってNULL_KEYを返します).
llHTTPRequest を呼び出す過程でシミュレータにより送信されるヘッダ
ヘッダ 説明 データ例
X-SecondLife-Shard オブジェクトの存在する環境。 "Production" はメイングリッド、 "Testing" はプレビューグリッドです。 Production
X-SecondLife-Object-Name スクリプトが入っているオブジェクトの名前 Object
X-SecondLife-Object-Key スクリプトが入っているオブジェクトのキー 01234567-89ab-cdef-0123-456789abcdef
X-SecondLife-Region オブジェクトが存在する地域名。地域南西端のグローバル座標も表示されます。 Jin Ho (264448, 233984)
X-SecondLife-Local-Position 地域内でのオブジェクトの位置 (173.009827, 75.551231, 60.950001)
X-SecondLife-Local-Rotation スクリプトが入っているオブジェクトの回転 0.000000, 0.000000, 0.000000, 1.000000
X-SecondLife-Local-Velocity オブジェクトの速度 0.000000, 0.000000, 0.000000
X-SecondLife-Owner-Name オブジェクトのオーナーの名前 Zeb Wyler
X-SecondLife-Owner-Key オブジェクトのオーナーの UUID 01234567-89ab-cdef-0123-456789abcdef
CGI 環境では名前全体を大文字にした変数でヘッダーを設置し、ダッシュをアンダースコアに置き換え、 "HTTP_" を名前の前につけます。例えば "X-SecondLife-Object-Name" は "HTTP_X_SECONDLIFE_OBJECT_NAME" となります。

警告

  • url内にスペースがある場合、http_response のステータスコードは 499 になるでしょう。
  • レスポンスの BODY は 2048 バイトが上限です。長い場合は切り捨てられるでしょう。
  • リクエストは オブジェクト 単位で抑制されます。(プリム単位ではありません)
    • リクエストは 20 秒毎に 25 リクエストを限界として抑制されます。1 秒間に 1 リクエスト、もしくは最大 25 リクエストの維持レートをサポートするためです。
  • インターネットからテクスチャあるいは画像を呼び出すことには使えません。詳細は Web Textures をみましょう。.
  • アクセスしたサイトが L$ トランザクションをレポートする LSL スクリプトに依存する場合、スクリプトはベータグリッド上で走っているかどうかを確認するために、X-SecondLife-Shard ヘッダを確認すべきです。
  • テキストか HTML ファイルのような承認できないメタデータファイルの POST の場合、 405 エラーを返すサーバもあります。いずれの環境でも確実に成功する GET メソッドを使うようにしましょう。
  • サーバから送信された HTTP ステータスコードがスクリプトに渡されても、302 のようなリダイレクトコードの場合、自動的にこっそりとリダイレクト先を追跡してリダイレクトして、その結果が返ります。
  • HTTP-in を使ったスクリプトに向けてリクエストを作成するとき、次のことがらがあてはまります。
All Issues ~ Search JIRA for related Bugs

サンプル

key http_request_id;

default
{
    state_entry()
    {
        http_request_id = llHTTPRequest("url", [], "");
    }

    http_response(key request_id, integer status, list metadata, string body)
    {
        if (request_id == http_request_id)
        {
            llSetText(body, <0,0,1>, 1);
        }
    }
}

PHPテストスクリプト例

<?php header("content-type: text/plain; charset=utf-8"); ?>
受信したヘッダ:
<?php

/**
 * @author Wouter Hobble
 * @copyright 2008
 */

foreach ($_SERVER as $k => $v)
{
	if( substr($k, 0, 5) == 'HTTP_')
	{
		print "\n". $k. "\t". $v;
	}
}
?>

Apacheヘッダとグローバルメソッドの両方をキャプチャするラッパースクリプト例

<?PHP
	// Author Waster Skronski.
	// General Public License (GPL).
	// Mind that some headers are not included because they're either useless or unreliable.
	$USE_APACHE_HEADERS = TRUE; // switch to false if you need cgi methods
	if ($USE_APACHE_HEADERS)
	{
		$headers 	= apache_request_headers();
		$objectgrid 	= $headers["X-SecondLife-Shard"];
		$objectname 	= $headers["X-SecondLife-Object-Name"];
		$objectkey     	= $headers["X-SecondLife-Object-Key"];
		$objectpos 	= $headers["X-SecondLife-Local-Position"];
		$ownerkey     	= $headers["X-SecondLife-Owner-Key"];
		$ownername 	= $headers["X-SecondLife-Owner-Name"];
		$regiondata     = $headers["X-SecondLife-Region"];
		$regiontmp 	= explode ("(",$regiondata); // cut cords off 
		$regionpos 	= explode (")",$regiontmp[1]); //
		$regionname 	= substr($regiontmp[0],0,-1); // cut last space from simname
	} else {
		$db = $GLOBALS;
		$headers 		= $db['HTTP_ENV_VARS'];
		$objectgrid 	= $headers["HTTP_X_SECONDLIFE_SHARD"]; 
		$objectname 	= $headers["HTTP_X_SECONDLIFE_OBJECT_NAME"];
		$objectkey     	= $headers["HTTP_X_SECONDLIFE_OBJECT_KEY"];
		$ownerkey     	= $headers["HTTP_X_SECONDLIFE_OWNER_KEY"];
		$objectpos     	= $headers["HTTP_X_SECONDLIFE_LOCAL_POSITION"];
		$ownername 	= $headers["HTTP_X_SECONDLIFE_OWNER_NAME"];
		$regiondata     = $headers["HTTP_X_SECONDLIFE_REGION"];
		$regiontmp 	= explode ("(",$regiondata); 
		$regionpos 	= explode (")",$regiontmp[1]);
		$regionname 	= substr($regiontmp[0],0,-1);
	}
?>

注意点

llHTTPRequest/http_response を使っているときに、なんらかの理由により正当な RSS フィードや他の Web コンテンツが解析できなくなった場合は、Second Life の外で作業する必要が出てくるでしょう。これは近い将来変更されることはないと思われます。ヘッダをチェックするのに、シミュレータレベルでさらにオーバーヘッドが加算されるからです。

llHTTPRequest を使っている時に、PC の Web ブラウザで期待した結果を返す URL と同じ URL にアクセスしても、Web ブラウザによっては、 NULL や意味のない結果を返すことがあるのに気づくでしょう。これは llHTTPRequest の User Agent 文字列が、 "Mozilla" を含んでいないため、 Web サーバによっては認知されないからだと思われます。"Mozilla" は、例えば、Shoutcast や RSS クライアントではなく、Web ブラウザであることを識別します。回避策としては、" HTTP/1.0\nUser-Agent: LSL Script (Mozilla Compatible)\n\n" や似たようなものを URL 文字列に追加します。それはその場しのぎで HTTP リクエストを Web ブラウザから送信されたかのように見せかけることになります。

CGI環境は名前全体を大文字にした変数でヘッダーを設置し、ダッシュをアンダースコアに置き換え、"HTTP_" を名前の前につけます。例えば "HTTP_X_SECONDLIFE_OBJECT_NAME" のようになります。PHP の $_SERVER 変数も同じようにします。

Apache は、CustomLog や LogFormat ディレクティブを使って、ログにヘッダを含めることができます。構文上の詳細については ドキュメント を参照しましょう。

関連項目

イベント

•  http_response

関数

•  llEscapeURL
•  llUnescapeURL

記事

•  Simulator IP Addresses

特記事項

Search JIRA for related Issues

Signature

function key llHTTPRequest( string url, list parameters, string body );
この翻訳は 原文 と比べて古いですか?間違いがありますか?読みにくいですか?みんなで 修正 していきましょう! (手順はこちら)
この項目はあなたにとって参考にならない項目ですか?もしかしたらLSL Wikiの関連した項目が参考になるかもしれません。