Difference between revisions of "LlHTTPRequest/ja"

From Second Life Wiki
Jump to navigation Jump to search
m (勘違い。元に戻す。)
m (<lsl> と <php> タグを <source> タグに置き換えました)
 
(One intermediate revision by one other user not shown)
Line 6: Line 6:
|func_desc=指定したURL、リクエストの本体とパラメータでHTTPリクエストを送信します。
|func_desc=指定したURL、リクエストの本体とパラメータでHTTPリクエストを送信します。
|sort=HTTPRequest
|sort=HTTPRequest
|func_footnot=
|func_footnote=
|return_type=key
|return_type=key
|return_text= HTTPリクエストが作成した識別のハンドル
|return_text= HTTPリクエストが作成した識別のハンドル
|p1_type=string|p1_name=url|p1_desc=有効なHTTP/HTTPS URL.
|p1_type=string|p1_name=url|p1_desc=有効なHTTP/HTTPS URL
|p2_type=list|p2_name=parameters|p2_desc=HTTP_*フラグ値の組み合わせで指定された、設定パラメータ
|p2_type=list|p2_name=parameters|p2_desc=HTTP_*フラグ値の組み合わせで指定された、設定パラメータ
[ parameter1, value1, parameter2, value2, . . . parameterN, valueN]
[ parameter1, value1, parameter2, value2, . . . parameterN, valueN]
Line 17: Line 17:
|spec
|spec
|caveats=
|caveats=
*'''url'''内にスペースがある場合、[[http_response/ja|http_response]]のステータスコードは499になるでしょう。
*'''url'''内にスペースがある場合、[[http_response/ja|http_response]] のステータスコードは 499 になるでしょう。
*レスポンスボディは2048バイトが上限です。長い場合は切り捨てられるでしょう。
*レスポンスの BODY は 2048 バイトが上限です。長い場合は切り捨てられるでしょう。
*リクエストはオブジェクト単位を基準として抑制されます。(プリム単位ではありません)
*リクエストは [[object/ja|オブジェクト]] 単位で抑制されます。(プリム単位ではありません)
**リクエストは20秒毎に25リクエストを限界として抑制されます。これは一秒間に承認される回数、あるいは25回までふくれあがることをサポートするということです。
**リクエストは 20 秒毎に 25 リクエストを限界として抑制されます。1 秒間に 1 リクエスト、もしくは最大 25 リクエストの維持レートをサポートするためです。
***See [http://forums.secondlife.com/showthread.php?t=108960 このスレッド]と、更なる詳細を[http://forums.secondlife.com/showthread.php?t=109571 このスレッド]で参照しましょう。
***[http://forums.secondlife.com/showthread.php?t=108960 このスレッド] と、更なる詳細を [http://forums.secondlife.com/showthread.php?t=109571 このスレッド] で参照しましょう。
*インターネットからテクスチャあるいは画像を呼び出すことには使えません。詳細は[[Web Textures]]をみましょう。.
*インターネットからテクスチャあるいは画像を呼び出すことには使えません。詳細は [[Web Textures]] をみましょう。.
*アクセスしたサイトがL$トランザクションをレポートするLSLスクリプトに依存する場合、スクリプトはベータグリッド上で走っているかどうかを確認するために、X-SecondLife-Shardヘッダを確認すべきです。
*アクセスしたサイトが L$ トランザクションをレポートする LSL スクリプトに依存する場合、スクリプトはベータグリッド上で走っているかどうかを確認するために、X-SecondLife-Shard ヘッダを確認すべきです。
* いくつかのサーバは、テキストかHTMLファイルのような承認できないメタデータファイルのPOSTの場合、405エラーを返すでしょう。いずれの環境でも確実に成功するGETメソッドを使うようにしましょう。
* テキストか HTML ファイルのような承認できないメタデータファイルの POST の場合、 405 エラーを返すサーバもあります。いずれの環境でも確実に成功する GET メソッドを使うようにしましょう。
|examples=<lsl>key http_request_id;
* サーバから送信された HTTP ステータスコードがスクリプトに渡されても、302 のようなリダイレクトコードの場合、自動的にこっそりとリダイレクト先を追跡してリダイレクトして、その結果が返ります。
* HTTP-in を使ったスクリプトに向けてリクエストを作成するとき、次のことがらがあてはまります。
** Cap URL にクエリ文字列を追加するときは、Cap の GUID とクエリ文字列の '?' トークンの間にスラッシュを入れなければなりません。例えば、 https://sim123.agni.lindenlab.com/cap/f23b4b94-012d-44f2-bd0c-16c328321221?arg=gra は HTTP 500 エラーを返しますが、 https://sim123.agni.lindenlab.com/cap/f23b4b94-012d-44f2-bd0c-16c328321221/?arg=gra は成功します。
|examples=<source lang="lsl2">key http_request_id;


default
default
Line 41: Line 44:
         }
         }
     }
     }
}</lsl>
}</source>


PHPテストスクリプト例
PHPテストスクリプト例
<php><?php header("content-type: text/plain; charset=utf-8"); ?>
<source lang="php"><?php header("content-type: text/plain; charset=utf-8"); ?>
受信したヘッダ:
受信したヘッダ:
<?php
<?php
Line 60: Line 63:
}
}
}
}
?></php>
?></source>


Apacheヘッダとグローバルメソッドの両方をキャプチャするラッパースクリプト例
Apacheヘッダとグローバルメソッドの両方をキャプチャするラッパースクリプト例
<php>
<source lang="php">
<?PHP
<?PHP
// Author Waster Skronski.
// Author Waster Skronski.
// General Public License (GPL).
// General Public License (GPL).
// Mind that some headers are not included becouse they either useless or unreliable.
// 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 methode
$USE_APACHE_HEADERS = TRUE; // switch to false if you need cgi methods
if ($USE_APACHE_HEADERS)
if ($USE_APACHE_HEADERS)
{
{
Line 97: Line 100:
}
}
?>
?>
</php>
</source>


<div style="display:none;"><lsl></lsl></div>
<div style="display:none;"><source lang="lsl2"></source></div>
|helpers
|helpers
|also_header
|also_header
|also_events={{LSL DefineRow||[[http_response/ja|http_response]]}}
|also_events={{LSL DefineRow||{{LSLG/ja|http_response}}}}
|also_functions={{LSL DefineRow||[[llEscapeURL/ja|llEscapeURL]]}}
|also_functions={{LSL DefineRow||{{LSLG/ja|llEscapeURL}}}}
{{LSL DefineRow||[[llUnescapeURL/ja|llUnescapeURL]]}}
{{LSL DefineRow||{{LSLG/ja|llUnescapeURL}}}}
|also_articles={{LSL DefineRow||[[Simulator IP Addresses/ja|Simulator IP Addresses]]}}
|also_articles={{LSL DefineRow||[[Simulator IP Addresses]]}}
|also_footer
|also_footer
|notes=いずれかの理由で[[llHTTPRequest/ja|llHTTPRequest]]/[[http_response/ja|http_response]]を使っている間、素晴らしいRSSフィードやいくつかのwebコンテンツのフォームは解析不可能であり、SecondLife外でその作業をする必要があるでしょう。これはシミュレータレベルで更なるオーバヘッドが必要なヘッダをチェックしているため、近い将来に変更することが好ましくないからです。
|notes=llHTTPRequest/http_response を使っているときに、なんらかの理由により正当な RSS フィードや他の Web コンテンツが解析できなくなった場合は、Second Life の外で作業する必要が出てくるでしょう。これは近い将来変更されることはないと思われます。ヘッダをチェックするのに、シミュレータレベルでさらにオーバーヘッドが加算されるからです。


llHTTPRequestが用いられたとき、期待された結果を返すPCウェブブラウザでの同じURLにも関わらず、いずれかのウェブサーバはnullあるいは無意味な結果を返すことが分かるはずです。これはllHTTPRequestのUserAgent文字列が"Mozilla"を保有していないとして、いずれかのウェブサーバから、例えばシャウトキャストあるいはRSSクライアントとされてしまい、ウェブブラウザの代わりとして承認されないからです。対応するには、" HTTP/1.0\nUser-Agent: LSL Script (Mozilla Compatible)\n\n"かこれに類似したウェブブラウザ自身のそれらしきHTTPリクエストの文字列を、解決するために付加しましょう。
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_"を名前の前につけます。例えば"X-SecondLife-Object-Name"は"HTTP_X_SECONDLIFE_OBJECT_NAME"となります。
CGI環境は名前全体を大文字にした変数でヘッダーを設置し、ダッシュをアンダースコアに置き換え、"HTTP_" を名前の前につけます。例えば "HTTP_X_SECONDLIFE_OBJECT_NAME" のようになります。PHP の $_SERVER 変数も同じようにします。
 
Apacheはログにヘッダを保有可能で、 管理にカスタムログとログフォーマットを用いています。構文上の詳細については[http://httpd.apache.org/docs/2.0/mod/mod_log_config.html#formats ドキュメント]を参照しましょう。


Apache は、CustomLog や LogFormat ディレクティブを使って、ログにヘッダを含めることができます。構文上の詳細については [http://httpd.apache.org/docs/2.0/mod/mod_log_config.html#formats ドキュメント] を参照しましょう。
|mode
|mode
|deprecated
|deprecated
Line 120: Line 122:
|cat1=HTTP
|cat1=HTTP
|cat2=XML-RPC
|cat2=XML-RPC
|cat3
|cat3=Communications
|cat4
|cat4=HTTP/Client
}}
}}

Latest revision as of 13:21, 2 January 2016

要約

関数: 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 を使ったスクリプトに向けてリクエストを作成するとき、次のことがらがあてはまります。

サンプル

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の関連した項目が参考になるかもしれません。