<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-CN">
	<id>http://i.bnu.edu.cn/wiki/index.php?action=history&amp;feed=atom&amp;title=%E8%99%9A%E6%8B%9F%E4%B8%96%E7%95%8C%2FHTTP</id>
	<title>虚拟世界/HTTP - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="http://i.bnu.edu.cn/wiki/index.php?action=history&amp;feed=atom&amp;title=%E8%99%9A%E6%8B%9F%E4%B8%96%E7%95%8C%2FHTTP"/>
	<link rel="alternate" type="text/html" href="http://i.bnu.edu.cn/wiki/index.php?title=%E8%99%9A%E6%8B%9F%E4%B8%96%E7%95%8C/HTTP&amp;action=history"/>
	<updated>2026-06-01T02:51:14Z</updated>
	<subtitle>本wiki的该页面的版本历史</subtitle>
	<generator>MediaWiki 1.31.0</generator>
	<entry>
		<id>http://i.bnu.edu.cn/wiki/index.php?title=%E8%99%9A%E6%8B%9F%E4%B8%96%E7%95%8C/HTTP&amp;diff=1820&amp;oldid=prev</id>
		<title>Wyg：创建页面，内容为“{{VWSnav}} ==相关函数==  ===llHTTPRequest=== 向指定的地址发送请求和参数 *key llHTTPRequest( string url, list parameters, string body ); #返回一…”</title>
		<link rel="alternate" type="text/html" href="http://i.bnu.edu.cn/wiki/index.php?title=%E8%99%9A%E6%8B%9F%E4%B8%96%E7%95%8C/HTTP&amp;diff=1820&amp;oldid=prev"/>
		<updated>2024-08-23T08:41:14Z</updated>

		<summary type="html">&lt;p&gt;创建页面，内容为“{{VWSnav}} ==相关函数==  ===llHTTPRequest=== 向指定的地址发送请求和参数 *key llHTTPRequest( string url, list parameters, string body ); #返回一…”&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{VWSnav}}&lt;br /&gt;
==相关函数==&lt;br /&gt;
&lt;br /&gt;
===llHTTPRequest===&lt;br /&gt;
向指定的地址发送请求和参数&lt;br /&gt;
*key llHTTPRequest( string url, list parameters, string body );&lt;br /&gt;
#返回一个key来标识发起的HTTP请求&lt;br /&gt;
#string	url: A valid HTTP/HTTPS URL.	&lt;br /&gt;
#list	parameters: configuration parameters, specified as HTTP_* flag-value pairs [ parameter1, value1, parameter2, value2, . . . parameterN, valueN]&lt;br /&gt;
#string	body: Contents of the request.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//HTTP_MIMETYPE:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;text/html&amp;quot;&lt;br /&gt;
&amp;quot;text/plain;charset=utf-8&amp;quot;&lt;br /&gt;
&amp;quot;application/xhtml+xml&amp;quot;&lt;br /&gt;
&amp;quot;application/json&amp;quot;&lt;br /&gt;
&amp;quot;application/x-www-form-urlencoded&amp;quot;&lt;br /&gt;
&amp;quot;application/rss+xml&amp;quot;&lt;br /&gt;
&amp;quot;multipart/mixed; boundary=&amp;quot;---1234567890---&amp;quot;&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*注意地址必须是服务器可访问到的&lt;br /&gt;
*HTTP_BODY_MAXLENGTH是发起请求的长度最大值，可以在服务器配置，但是响应的值被限制为2048，这个值还不可以配置。&lt;br /&gt;
*body内容不要随便乱写&lt;br /&gt;
#如果是post方法，可以：string body=&amp;quot;param1=v1&amp;amp;param2=v2&amp;quot;&lt;br /&gt;
#如果是get方法，可以将“?param1=v1&amp;amp;param2=v2”这个放到url中，然后body用空字符串。&lt;br /&gt;
*例子&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
key httpreq(string page,string MSG)&lt;br /&gt;
{&lt;br /&gt;
    return llHTTPRequest(page,[&lt;br /&gt;
                                HTTP_METHOD,&lt;br /&gt;
                                            &amp;quot;GET&amp;quot; &lt;br /&gt;
                                            // &amp;quot;POST&amp;quot; &lt;br /&gt;
                                            //&amp;quot;PUT&amp;quot; &lt;br /&gt;
                                            //&amp;quot;DELETE&amp;quot; &lt;br /&gt;
                                            ,&lt;br /&gt;
                                HTTP_MIMETYPE,&lt;br /&gt;
                                                //&amp;quot;text/application/xhtml+xml&amp;quot;&lt;br /&gt;
                                                //&amp;quot;text/application/atom+xml&amp;quot;&lt;br /&gt;
                                                //&amp;quot;text/application/json&amp;quot;&lt;br /&gt;
                                                //&amp;quot;text/application/xml&amp;quot;&lt;br /&gt;
                                                //&amp;quot;text/application/llsd+xml&amp;quot;&lt;br /&gt;
                                                //&amp;quot;text/application/x-javascript&amp;quot;&lt;br /&gt;
                                                //&amp;quot;text/application/javascript&amp;quot;&lt;br /&gt;
                                                &amp;quot;text/application/x-www-form-urlencoded&amp;quot;&lt;br /&gt;
                                                //&amp;quot;text/application/rss+xml&amp;quot;&lt;br /&gt;
                                                ,&lt;br /&gt;
                                HTTP_BODY_MAXLENGTH,16384,&lt;br /&gt;
                                HTTP_VERIFY_CERT,TRUE,&lt;br /&gt;
                                HTTP_VERBOSE_THROTTLE,TRUE,&lt;br /&gt;
                                //HTTP_CUSTOM_HEADER,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&lt;br /&gt;
                                HTTP_PRAGMA_NO_CACHE,TRUE&lt;br /&gt;
                            ],MSG);&lt;br /&gt;
}&lt;br /&gt;
key reqed;&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
    {&lt;br /&gt;
        reqed=httpreq( &amp;quot;http://127.0.0.1/test/data?content=wei&amp;quot;,&amp;quot;&amp;quot;);&lt;br /&gt;
        llSay(0,&amp;quot;touch_start:&amp;quot;+reqed);&lt;br /&gt;
    }&lt;br /&gt;
    http_response(key request_id, integer status, list metadata, string body)&lt;br /&gt;
    {&lt;br /&gt;
        llSay(0,&amp;quot;http_response:&amp;quot;+request_id);&lt;br /&gt;
        if(reqed==request_id)&lt;br /&gt;
        {&lt;br /&gt;
            llSay(0,&amp;quot;http_response:&amp;quot;+body);      &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===llHTTPResponse===&lt;br /&gt;
以status和body响应request_id所标识的请求。相当于提供http响应，一般与llRequestURL配合使用。&lt;br /&gt;
*llHTTPResponse( key request_id, integer status, string body );&lt;br /&gt;
#key request_id: A valid HTTP request key.	&lt;br /&gt;
#integer status: HTTP Status (200, 400, 404, etc)	&lt;br /&gt;
#string body: 响应内容。&lt;br /&gt;
*注意事项&lt;br /&gt;
#The response need not be made inside the http_request event but if it does not happen in a timely fashion the request will time out (within 25 seconds).&lt;br /&gt;
#This call must be made by the script containing the http_request event where the request_id was received.&lt;br /&gt;
#There is no limit, other than script size, to the amount of data that can be sent by this function.&lt;br /&gt;
#The response by default has &amp;quot;content-type: text/plain&amp;quot;. Use llSetContentType to optionally return a different type, like &amp;quot;text/html&amp;quot;.&lt;br /&gt;
*例子&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
string url;&lt;br /&gt;
 &lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    changed(integer change)//很多事情都会导致这个事情发生：CHANGED_INVENTORY、CHANGED_COLOR、CHANGED_SHAPE、CHANGED_SCALE、CHANGED_TEXTURE、CHANGED_LINK等等&lt;br /&gt;
    {&lt;br /&gt;
        if (change &amp;amp; (CHANGED_REGION_START | CHANGED_REGION | CHANGED_TELEPORT))&lt;br /&gt;
            llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llRequestURL();&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    touch_start(integer num_detected)&lt;br /&gt;
    {&lt;br /&gt;
    //  PUBLIC_CHANNEL has the integer value 0&lt;br /&gt;
        if (url != &amp;quot;&amp;quot;)&lt;br /&gt;
            llSay(PUBLIC_CHANNEL, &amp;quot;URL: &amp;quot; + url);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    http_request(key id, string method, string body)&lt;br /&gt;
    {&lt;br /&gt;
    //  http://en.wikipedia.org/wiki/Create,_read,_update_and_delete&lt;br /&gt;
        list CRUDmethods = [&amp;quot;GET&amp;quot;, &amp;quot;POST&amp;quot;, &amp;quot;PUT&amp;quot;, &amp;quot;DELETE&amp;quot;];&lt;br /&gt;
    //  it's bit-wise NOT ( ~ ) !!!&lt;br /&gt;
        integer isAllowedMethod = ~llListFindList(CRUDmethods, [method]);&lt;br /&gt;
 &lt;br /&gt;
        if (isAllowedMethod)&lt;br /&gt;
        {&lt;br /&gt;
            llHTTPResponse(id, 200, &amp;quot;Body of request below:\n&amp;quot; + body);&lt;br /&gt;
        }&lt;br /&gt;
        else if (method == URL_REQUEST_GRANTED)&lt;br /&gt;
        {&lt;br /&gt;
        //  don't forget the trailing slash&lt;br /&gt;
            url = body + &amp;quot;/&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
            llOwnerSay(&amp;quot;URL: &amp;quot; + url);&lt;br /&gt;
        }&lt;br /&gt;
        else if (method == URL_REQUEST_DENIED)&lt;br /&gt;
        {&lt;br /&gt;
            llOwnerSay(&amp;quot;Something went wrong, no URL.\n&amp;quot; + body);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            llOwnerSay(&amp;quot;Ummm... I have no idea what SL just did. Method=\&amp;quot;&amp;quot;+method+&amp;quot;\&amp;quot;\n&amp;quot; + body);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===osRequestURL===&lt;br /&gt;
请求HTTP:// url (opensim version 0.9 or over)，与llRequestURL功能类似&lt;br /&gt;
&lt;br /&gt;
支持可选参数，如 &amp;quot;allowXss&amp;quot; - Add 'Access-Control-Allow-Origin: *' to response header&lt;br /&gt;
*例子&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//&lt;br /&gt;
//osRequestURL example&lt;br /&gt;
//&lt;br /&gt;
 &lt;br /&gt;
RequestReceived (key id, string query) {&lt;br /&gt;
    llHTTPResponse (id,200,query+&amp;quot; OK&amp;quot;);&lt;br /&gt;
    query = llUnescapeURL(query);&lt;br /&gt;
    llSay (0, query);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
default {&lt;br /&gt;
 &lt;br /&gt;
    state_entry() {&lt;br /&gt;
        osRequestURL ([ &amp;quot;allowXss&amp;quot; ]);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    http_request(key id, string method, string body) {&lt;br /&gt;
 &lt;br /&gt;
        if (method == URL_REQUEST_GRANTED)&lt;br /&gt;
           llOwnerSay (&amp;quot;URL_REQUEST_GRANTED&amp;quot; +&amp;quot;\n&amp;quot; +body);&lt;br /&gt;
 &lt;br /&gt;
        if (method == URL_REQUEST_DENIED)&lt;br /&gt;
            llOwnerSay (&amp;quot;URL_REQUEST_DENIED&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
        if (method == &amp;quot;GET&amp;quot;)&lt;br /&gt;
            RequestReceived (id, llGetHTTPHeader(id,&amp;quot;x-query-string&amp;quot;));&lt;br /&gt;
 &lt;br /&gt;
        if (method == &amp;quot;POST&amp;quot;)&lt;br /&gt;
            RequestReceived (id, body);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===osRequestSecureURL===&lt;br /&gt;
请求HTTPS:// url (opensim version 0.9 or over)，与llRequestSecureURL类似&lt;br /&gt;
&lt;br /&gt;
可选参数支持: &amp;quot;allowXss&amp;quot; - Add 'Access-Control-Allow-Origin: *' to response header&lt;br /&gt;
&lt;br /&gt;
*例子&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//&lt;br /&gt;
//osRequestSecureURL example&lt;br /&gt;
//&lt;br /&gt;
 &lt;br /&gt;
RequestReceived (key id, string query) {&lt;br /&gt;
    llHTTPResponse (id,200,query+&amp;quot; OK&amp;quot;);&lt;br /&gt;
    query = llUnescapeURL(query);&lt;br /&gt;
    llSay (0, query);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
default {&lt;br /&gt;
 &lt;br /&gt;
    state_entry() {&lt;br /&gt;
        osRequestSecureURL ([ &amp;quot;allowXss&amp;quot; ]);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    http_request(key id, string method, string body) {&lt;br /&gt;
 &lt;br /&gt;
        if (method == URL_REQUEST_GRANTED)&lt;br /&gt;
           llOwnerSay (&amp;quot;URL_REQUEST_GRANTED&amp;quot; +&amp;quot;\n&amp;quot; +body);&lt;br /&gt;
 &lt;br /&gt;
        if (method == URL_REQUEST_DENIED)&lt;br /&gt;
            llOwnerSay (&amp;quot;URL_REQUEST_DENIED&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
        if (method == &amp;quot;GET&amp;quot;)&lt;br /&gt;
            RequestReceived (id, llGetHTTPHeader(id,&amp;quot;x-query-string&amp;quot;));&lt;br /&gt;
 &lt;br /&gt;
        if (method == &amp;quot;POST&amp;quot;)&lt;br /&gt;
            RequestReceived (id, body);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===llRequestURL===&lt;br /&gt;
请求一个用于此脚本的“HTTP://”url。该请求将导致 http_request事件发生。HTTP使用12046端口（HTTP-in uses port 12046）。采用llGetFreeURLs函数可以返回还有多少个URL资源可以使用&lt;br /&gt;
&lt;br /&gt;
该请求后，就会类似在12046端口开启了一个监听，通过http可以访问到该监听。&lt;br /&gt;
&lt;br /&gt;
*key llRequestURL( );&lt;br /&gt;
#Returns a handle (a key) used for identifying the result of the request in the http_request event.&lt;br /&gt;
#HTTP-in uses port 12046.&lt;br /&gt;
#Use of this function is throttled. Although it has no forced sleep time, too many requests (5 ish) in a short period will cause all further requests to be denied until the script stops requesting urls for at least 1 second. Using an llSleep of 0.6 seconds or greater between each request will prevent you from being throttled.&lt;br /&gt;
#When a region is (re)started all HTTP server URLs are automatically released and invalidated.&lt;br /&gt;
#Use CHANGED_REGION_START to detect this so new URL can be requested.&lt;br /&gt;
#The number of available URLs is a limited resource, that is to say, a script can only have so many open URLs. See LSL http_server#Resource Limitations for details.&lt;br /&gt;
#When abandoning a URL, release it with llReleaseURL, to avoid leaks. Resetting the script, or deleting the prim will also suffice to release URLs.&lt;br /&gt;
&lt;br /&gt;
*例子：岛屿重启后，请求一个URL&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
string url;&lt;br /&gt;
key urlRequestId;&lt;br /&gt;
 &lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
	urlRequestId = llRequestURL();&lt;br /&gt;
    }&lt;br /&gt;
    on_rez(integer start_param)&lt;br /&gt;
    {&lt;br /&gt;
	llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    changed(integer change)&lt;br /&gt;
    {&lt;br /&gt;
	if (change &amp;amp; (CHANGED_OWNER | CHANGED_INVENTORY))&lt;br /&gt;
		llResetScript();&lt;br /&gt;
 &lt;br /&gt;
	if (change &amp;amp; (CHANGED_REGION | CHANGED_REGION_START | CHANGED_TELEPORT))&lt;br /&gt;
		urlRequestId = llRequestURL();&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    http_request(key id, string method, string body)&lt;br /&gt;
    {&lt;br /&gt;
	if (id == urlRequestId)&lt;br /&gt;
	{&lt;br /&gt;
	    if (method == URL_REQUEST_DENIED)&lt;br /&gt;
		llOwnerSay(&amp;quot;The following error occurred while attempting to get a free URL for this device:\n \n&amp;quot; + body);&lt;br /&gt;
 &lt;br /&gt;
	    else if (method == URL_REQUEST_GRANTED)&lt;br /&gt;
	    {&lt;br /&gt;
		url = body;&lt;br /&gt;
		llLoadURL(llGetOwner(), &amp;quot;Click to visit my URL!&amp;quot;, url);&lt;br /&gt;
	    }&lt;br /&gt;
	}&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意建立请求后，该监听就一直存在，而一般资源是有限的，所以在不用时一定要释放。一般可以保存好监听的id在全局环境中，不用后使用llReleaseURL函数来释放。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// WARNING:&lt;br /&gt;
//&lt;br /&gt;
//      This script is only for proof-of-concept (demo purposes).&lt;br /&gt;
//      DO NOT use it if you don't have the sim owners and/or&lt;br /&gt;
//      estate managers OK to test this script.&lt;br /&gt;
//      This script can possibly block HTTP communication from and to the sim.&lt;br /&gt;
//      ...bringing down all networked vendors and/or similar machines.&lt;br /&gt;
//&lt;br /&gt;
//      This script allocates all available URLs.&lt;br /&gt;
//      Deleting the script and/or derezzing the object containing the script,&lt;br /&gt;
//      will release all previously taken URLs.&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llRequestURL();&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    http_request(key id, string method, string body)&lt;br /&gt;
    {&lt;br /&gt;
        if (method == URL_REQUEST_DENIED)&lt;br /&gt;
            llSetText(&amp;quot;No free URLs!&amp;quot;, &amp;lt;1.0, 0.0, 0.0&amp;gt;, 1.0);&lt;br /&gt;
 &lt;br /&gt;
        else if (method == URL_REQUEST_GRANTED)&lt;br /&gt;
        {&lt;br /&gt;
            llSetText( (string)llGetFreeURLs() + &amp;quot; URLs left\n&amp;quot; + body, &amp;lt;1.0, 1.0, 1.0&amp;gt;, 1.0);&lt;br /&gt;
 &lt;br /&gt;
            llRequestURL();&lt;br /&gt;
        }&lt;br /&gt;
        else if (method == &amp;quot;GET&amp;quot;)&lt;br /&gt;
            llHTTPResponse(id, 200, &amp;quot;Hello there!&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===llGetFreeURLs===&lt;br /&gt;
获取还有多少监听url可用。&lt;br /&gt;
*例子&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    touch_start(integer num_detected)&lt;br /&gt;
    {&lt;br /&gt;
        integer numberOfFreeURLs = llGetFreeURLs();&lt;br /&gt;
 &lt;br /&gt;
        if(numberOfFreeURLs)&lt;br /&gt;
            llSay(0,  &amp;quot;There are &amp;quot; + (string)numberOfFreeURLs + &amp;quot; available HTTP-In URLs left for this sim.&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
        else&lt;br /&gt;
            llSay(0, &amp;quot;WARNING: There are no HTTP-In URLs available anymore.&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// WARNING:&lt;br /&gt;
//&lt;br /&gt;
//      This script is only for proof-of-concept (demo purposes).&lt;br /&gt;
//      DO NOT use it if you don't have the sim owners and/or&lt;br /&gt;
//      estate managers OK to test this script.&lt;br /&gt;
//      This script can possibly block HTTP communication from and to the sim.&lt;br /&gt;
//      ...bringing down all networked vendors and/or similar machines.&lt;br /&gt;
//&lt;br /&gt;
//      This script allocates all available URLs.&lt;br /&gt;
//      Deleting the script and/or derezzing the object containing the script,&lt;br /&gt;
//      will release all previously taken URLs.&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llRequestURL();&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    http_request(key request_id, string method, string body)&lt;br /&gt;
    {&lt;br /&gt;
        if (method == URL_REQUEST_DENIED)&lt;br /&gt;
            llSetText(&amp;quot;No free URLs!&amp;quot;, &amp;lt;1.0, 0.0, 0.0&amp;gt;, 1.0);&lt;br /&gt;
 &lt;br /&gt;
        else if (method == URL_REQUEST_GRANTED)&lt;br /&gt;
        {&lt;br /&gt;
            llSetText( (string)llGetFreeURLs() + &amp;quot; URLs left\n&amp;quot; + body, &amp;lt;1.0, 1.0, 1.0&amp;gt;, 1.0);&lt;br /&gt;
 &lt;br /&gt;
            llRequestURL();&lt;br /&gt;
        }&lt;br /&gt;
        else if (method == &amp;quot;GET&amp;quot;)&lt;br /&gt;
            llHTTPResponse(id, 200, &amp;quot;Hello there!&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===llRequestSecureURL===&lt;br /&gt;
为本模型开启 HTTPS:// (SSL) url。http_request事件会被激发。使用端口：12043。&lt;br /&gt;
&lt;br /&gt;
该调用返回一个key，用于在http_request事件中标识。&lt;br /&gt;
&lt;br /&gt;
*警告&lt;br /&gt;
#HTTPS-in uses port 12043.&lt;br /&gt;
#When a region is (re)started all HTTP server URLs are automatically released and invalidated.&lt;br /&gt;
#Use CHANGED_REGION_START to detect this so new URL can be requested.&lt;br /&gt;
&lt;br /&gt;
*例子&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
string secureUrl;&lt;br /&gt;
key urlRequestId;&lt;br /&gt;
key selfCheckRequestId;&lt;br /&gt;
 &lt;br /&gt;
request_secure_url()&lt;br /&gt;
{&lt;br /&gt;
    llReleaseURL(secureUrl);&lt;br /&gt;
    secureUrl = &amp;quot;&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
    urlRequestId = llRequestSecureURL();&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
throw_exception(string inputString)&lt;br /&gt;
{&lt;br /&gt;
    key owner = llGetOwner();&lt;br /&gt;
    llInstantMessage(owner, inputString);&lt;br /&gt;
 &lt;br /&gt;
    // yeah, bad way to handle exceptions by restarting.&lt;br /&gt;
    // However this is just a demo script...&lt;br /&gt;
 &lt;br /&gt;
    llResetScript();&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    on_rez(integer start_param)&lt;br /&gt;
    {&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    changed(integer change)&lt;br /&gt;
    {&lt;br /&gt;
        if (change &amp;amp; (CHANGED_OWNER | CHANGED_INVENTORY))&lt;br /&gt;
        {&lt;br /&gt;
            llReleaseURL(secureUrl);&lt;br /&gt;
            secureUrl = &amp;quot;&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
            llResetScript();&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        if (change &amp;amp; (CHANGED_REGION | CHANGED_REGION_START | CHANGED_TELEPORT))&lt;br /&gt;
            request_secure_url();&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        request_secure_url();&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    http_request(key id, string method, string body)&lt;br /&gt;
    {&lt;br /&gt;
        integer responseStatus = 400;&lt;br /&gt;
        string responseBody = &amp;quot;Unsupported method&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
        if (method == URL_REQUEST_DENIED)&lt;br /&gt;
            throw_exception(&amp;quot;The following error occurred while attempting to get a free URL for this device:\n \n&amp;quot; + body);&lt;br /&gt;
 &lt;br /&gt;
        else if (method == URL_REQUEST_GRANTED)&lt;br /&gt;
        {&lt;br /&gt;
            secureUrl = body;&lt;br /&gt;
            key owner = llGetOwner();&lt;br /&gt;
            llLoadURL(owner, &amp;quot;Click to visit my URL!&amp;quot;, secureUrl);&lt;br /&gt;
 &lt;br /&gt;
            // check every 5 mins for dropped URL&lt;br /&gt;
            llSetTimerEvent(300.0);&lt;br /&gt;
        }&lt;br /&gt;
        else if (method == &amp;quot;GET&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            responseStatus = 200;&lt;br /&gt;
            responseBody = &amp;quot;Hello world!&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        // else if (method == &amp;quot;POST&amp;quot;) ...;&lt;br /&gt;
        // else if (method == &amp;quot;PUT&amp;quot;) ...;&lt;br /&gt;
        // else if (method == &amp;quot;DELETE&amp;quot;) { responseStatus = 403; responseBody = &amp;quot;forbidden&amp;quot;; }&lt;br /&gt;
 &lt;br /&gt;
        llHTTPResponse(id, responseStatus, responseBody);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    http_response(key id, integer status, list metaData, string body)&lt;br /&gt;
    {&lt;br /&gt;
        if (id == selfCheckRequestId)&lt;br /&gt;
        {&lt;br /&gt;
            // If you're not usually doing this,&lt;br /&gt;
            // now is a good time to get used to doing it!&lt;br /&gt;
            selfCheckRequestId = NULL_KEY;&lt;br /&gt;
 &lt;br /&gt;
            if (status != 200)&lt;br /&gt;
                request_secure_url();&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        else if (id == NULL_KEY)&lt;br /&gt;
            throw_exception(&amp;quot;Too many HTTP requests too fast!&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        selfCheckRequestId = llHTTPRequest(secureUrl,&lt;br /&gt;
                                [HTTP_METHOD, &amp;quot;GET&amp;quot;,&lt;br /&gt;
                                    HTTP_VERBOSE_THROTTLE, FALSE,&lt;br /&gt;
                                    HTTP_BODY_MAXLENGTH, 16384],&lt;br /&gt;
                                &amp;quot;&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===llReleaseURL===&lt;br /&gt;
*释放特定的URL，它将不再被使用&lt;br /&gt;
#string	url: URL to release	&lt;br /&gt;
*警告：URLs are automatically released and invalidated in certain situations. In the following situations, there is no need to call llReleaseURL. But you will have to request a new one afterwards&lt;br /&gt;
#When the region is restarted or goes offline&lt;br /&gt;
#When the script holding the URLs is reset, or recompiled&lt;br /&gt;
#When the object containing the script is deleted, or taken to inventory&lt;br /&gt;
&lt;br /&gt;
*例子&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
string url;&lt;br /&gt;
key urlRequestId;&lt;br /&gt;
key selfCheckRequestId;&lt;br /&gt;
 &lt;br /&gt;
request_url()&lt;br /&gt;
{&lt;br /&gt;
    llReleaseURL(url);&lt;br /&gt;
    url = &amp;quot;&amp;quot;;&lt;br /&gt;
    llSetTimerEvent(0.0);&lt;br /&gt;
    urlRequestId = llRequestURL();&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
throw_exception(string inputString)&lt;br /&gt;
{&lt;br /&gt;
    llInstantMessage(llGetOwner(), inputString);&lt;br /&gt;
 &lt;br /&gt;
    // yeah, bad way to handle exceptions by restarting.&lt;br /&gt;
    // However this is just a demo script...&lt;br /&gt;
 &lt;br /&gt;
    llResetScript();&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    on_rez(integer start_param)&lt;br /&gt;
    {&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    changed(integer change)&lt;br /&gt;
    {&lt;br /&gt;
        if (change &amp;amp; CHANGED_OWNER | CHANGED_REGION | CHANGED_REGION_START)&lt;br /&gt;
            llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        request_url();&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    http_request(key id, string method, string body)&lt;br /&gt;
    {&lt;br /&gt;
        integer responseStatus = 400;&lt;br /&gt;
        string responseBody = &amp;quot;Unsupported method&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
        if (method == URL_REQUEST_DENIED)&lt;br /&gt;
            throw_exception(&amp;quot;The following error occurred while attempting to get a free URL for this device:\n \n&amp;quot; + body);&lt;br /&gt;
        else if (method == URL_REQUEST_GRANTED)&lt;br /&gt;
        {&lt;br /&gt;
            url = body;&lt;br /&gt;
            llLoadURL(llGetOwner(), &amp;quot;Click to visit my URL!&amp;quot;, url);&lt;br /&gt;
 &lt;br /&gt;
            // check every 5 mins for dropped URL&lt;br /&gt;
            llSetTimerEvent(300.0);&lt;br /&gt;
        }&lt;br /&gt;
        else if (method == &amp;quot;GET&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            responseStatus = 200;&lt;br /&gt;
            responseBody = &amp;quot;Hello world!&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        // else if (method == &amp;quot;POST&amp;quot;) ...;&lt;br /&gt;
        // else if (method == &amp;quot;PUT&amp;quot;) ...;&lt;br /&gt;
        // else if (method == &amp;quot;DELETE&amp;quot;) { responseStatus = 403; responseBody = &amp;quot;forbidden&amp;quot;; }&lt;br /&gt;
 &lt;br /&gt;
        llHTTPResponse(id, responseStatus, responseBody);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    http_response(key id, integer status, list metaData, string body)&lt;br /&gt;
    {&lt;br /&gt;
        if (id == selfCheckRequestId)&lt;br /&gt;
        {&lt;br /&gt;
            // If you're not usually doing this,&lt;br /&gt;
            // now is a good time to get used to doing it!&lt;br /&gt;
            selfCheckRequestId = NULL_KEY;&lt;br /&gt;
 &lt;br /&gt;
            if (status != 200)&lt;br /&gt;
                request_url();&lt;br /&gt;
        }&lt;br /&gt;
        else if (id == NULL_KEY)&lt;br /&gt;
            throw_exception(&amp;quot;Too many HTTP requests too fast!&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        selfCheckRequestId = llHTTPRequest(url,&lt;br /&gt;
                                [HTTP_METHOD, &amp;quot;GET&amp;quot;,&lt;br /&gt;
                                    HTTP_VERBOSE_THROTTLE, FALSE,&lt;br /&gt;
                                    HTTP_BODY_MAXLENGTH, 16384],&lt;br /&gt;
                                &amp;quot;&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===llLoadURL===&lt;br /&gt;
显示一个对话框，让化身决定是否需要加载网页。如果用户单击是，根据需要启动浏览器，并加载相关网页。&lt;br /&gt;
*llLoadURL( key avatar, string message, string url );&lt;br /&gt;
#key avatar: avatar UUID that is in the same region	&lt;br /&gt;
#string	message: message to be displayed in the dialog box	&lt;br /&gt;
#string	url	&lt;br /&gt;
*警告		&lt;br /&gt;
#url长度限制为255，消息内容限制为254个字符。&lt;br /&gt;
#必须指定协议，目前支持：&amp;quot;https://&amp;quot;和&amp;quot;http://&amp;quot;。&lt;br /&gt;
#URL遵循规划RFC-1738。&lt;br /&gt;
#该函数将导致脚本休眠0.1秒。&lt;br /&gt;
#不能在组物体中调研这个函数，如果调用会默默失败。&lt;br /&gt;
#如果化身自己禁用了，该函数也会默默失败。&lt;br /&gt;
*例子&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    touch_start(integer num_detected)&lt;br /&gt;
    {&lt;br /&gt;
        key     id              = llDetectedKey(0);&lt;br /&gt;
        integer avatarInSameSim = (llGetAgentSize(id) != ZERO_VECTOR);// TRUE or FALSE&lt;br /&gt;
 &lt;br /&gt;
        if (avatarInSameSim)&lt;br /&gt;
        {&lt;br /&gt;
            string info = &amp;quot;Visit the There website!&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
            // must start with either &amp;quot;http://...&amp;quot; or &amp;quot;https://...&amp;quot;&lt;br /&gt;
            string url = &amp;quot;http://vthere.bnu.edu.cn/&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
            llLoadURL(id, info, url);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            llInstantMessage(id, &amp;quot;I can only open a URL dialog on your screen if you're in my sim!&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===llGetHTTPHeader===&lt;br /&gt;
返回request_id所标识的请求的头中的值.&lt;br /&gt;
*string llGetHTTPHeader( key request_id, string header );&lt;br /&gt;
#key request_id: A valid HTTP request key.	&lt;br /&gt;
#string header: Lower case header value name.	&lt;br /&gt;
*警告&lt;br /&gt;
#Returns an empty string if the header is not found or if the headers can no longer be accessed. Headers can only be accessed before llHTTPResponse is called and with-in the first 30 seconds after the http_request event is queued.&lt;br /&gt;
#Header information becomes inaccessible after 30 seconds or if llHTTPResponse is called.&lt;br /&gt;
#Custom headers are not supported, only the headers listed in the specification are supported.&lt;br /&gt;
#LSL is not a CGI environment&lt;br /&gt;
##&amp;quot;Content-Type&amp;quot; is an example of a normal header name, in a CGI environment the name would be &amp;quot;HTTP_CONTENT_TYPE&amp;quot;.&lt;br /&gt;
#header must be lower case (or it will match nothing). All header names are converted to lower case when they are received.&lt;br /&gt;
#When making a request...&lt;br /&gt;
##The path part of the URL must be prefixed with a forward slash&lt;br /&gt;
###Good: https://sim3015.aditi.lindenlab.com:12043/cap/a7717681-2c04-e4ac-35e3-1f01c9861322/foo&lt;br /&gt;
###Bad: https://sim3015.aditi.lindenlab.com:12043/cap/a7717681-2c04-e4ac-35e3-1f01c9861322foo&lt;br /&gt;
##In order to use the query string, you must include a path (even if it is just a slash)&lt;br /&gt;
###Good: https://sim3015.aditi.lindenlab.com:12043/cap/a7717681-2c04-e4ac-35e3-1f01c9861322/?arg=gra&lt;br /&gt;
###Bad: https://sim3015.aditi.lindenlab.com:12043/cap/a7717681-2c04-e4ac-35e3-1f01c9861322?arg=gra&lt;br /&gt;
*例子&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
key url_request;&lt;br /&gt;
 &lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        url_request = llRequestURL();&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    http_request(key id, string method, string body)&lt;br /&gt;
    {&lt;br /&gt;
        if (url_request == id)&lt;br /&gt;
        {&lt;br /&gt;
        //  if you're usually not resetting the query ID&lt;br /&gt;
        //  now is a good time to start!&lt;br /&gt;
            url_request = &amp;quot;&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
            if (method == URL_REQUEST_GRANTED)&lt;br /&gt;
            {&lt;br /&gt;
                llOwnerSay(&amp;quot;URL: &amp;quot; + body);&lt;br /&gt;
 &lt;br /&gt;
                key owner = llGetOwner();&lt;br /&gt;
                vector ownerSize = llGetAgentSize(owner);&lt;br /&gt;
 &lt;br /&gt;
                if (ownerSize)//  != ZERO_VECTOR&lt;br /&gt;
                    llLoadURL(owner, &amp;quot;I got a new URL!&amp;quot;, body);&lt;br /&gt;
            }&lt;br /&gt;
 &lt;br /&gt;
            else if (method == URL_REQUEST_DENIED)&lt;br /&gt;
                llOwnerSay(&amp;quot;Something went wrong, no url:\n&amp;quot; + body);&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            list headerList = [&amp;quot;x-script-url&amp;quot;,&lt;br /&gt;
                            &amp;quot;x-path-info&amp;quot;, &amp;quot;x-query-string&amp;quot;,&lt;br /&gt;
                            &amp;quot;x-remote-ip&amp;quot;, &amp;quot;user-agent&amp;quot;];&lt;br /&gt;
 &lt;br /&gt;
            integer index = -llGetListLength(headerList);&lt;br /&gt;
            do&lt;br /&gt;
            {&lt;br /&gt;
                string header = llList2String(headerList, index);&lt;br /&gt;
                llOwnerSay(header + &amp;quot;: &amp;quot; + llGetHTTPHeader(id, header));&lt;br /&gt;
            }&lt;br /&gt;
            while (++index);&lt;br /&gt;
 &lt;br /&gt;
            llOwnerSay(&amp;quot;body:\n&amp;quot; + body);&lt;br /&gt;
            llHTTPResponse(id, 200, body);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===llEscapeURL===&lt;br /&gt;
Returns a string that is the escaped/encoded version of url, replacing spaces with &amp;quot;%20&amp;quot; etc. The function will escape any character not in [a-zA-Z0-9] to &amp;quot;%xx&amp;quot; where &amp;quot;xx&amp;quot; is the hexadecimal value of the character in UTF-8 byte form.&lt;br /&gt;
&lt;br /&gt;
===llUnescapeURL===&lt;br /&gt;
Returns a string that is an unescaped/unencoded version of url, replacing &amp;quot;%20&amp;quot; with spaces etc.&lt;br /&gt;
&lt;br /&gt;
===llSetContentType===&lt;br /&gt;
llSetContentType( key request_id, integer content_type );&lt;br /&gt;
Sets the Internet media type &amp;quot;Content-Type&amp;quot; header of any subsequent LSL HTTP server response via llHTTPResponse.&lt;br /&gt;
#key request_id: a valid http_request() key	&lt;br /&gt;
#integer content_type: Media type to use with any following llHTTPResponse(request_id, ...)	&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
key url_request;&lt;br /&gt;
 &lt;br /&gt;
string HTML_BODY =&lt;br /&gt;
&amp;quot;&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;h1&amp;gt;My First Heading&amp;lt;/h1&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;p&amp;gt;My first paragraph.&amp;lt;/p&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        url_request = llRequestURL();&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    http_request(key id, string method, string body)&lt;br /&gt;
    {&lt;br /&gt;
        key owner = llGetOwner();&lt;br /&gt;
        vector ownerSize = llGetAgentSize(owner);&lt;br /&gt;
 &lt;br /&gt;
        if (url_request == id)&lt;br /&gt;
        {&lt;br /&gt;
        //  if you're usually not resetting the query ID&lt;br /&gt;
        //  now is a good time to start!&lt;br /&gt;
            url_request = &amp;quot;&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
            if (method == URL_REQUEST_GRANTED)&lt;br /&gt;
            {&lt;br /&gt;
                llOwnerSay(&amp;quot;URL: &amp;quot; + body);&lt;br /&gt;
 &lt;br /&gt;
            //  if owner in sim&lt;br /&gt;
                if (ownerSize)//  != ZERO_VECTOR&lt;br /&gt;
                    llLoadURL(owner, &amp;quot;I got a new URL!&amp;quot;, body);&lt;br /&gt;
            }&lt;br /&gt;
 &lt;br /&gt;
            else if (method == URL_REQUEST_DENIED)&lt;br /&gt;
                llOwnerSay(&amp;quot;Something went wrong, no url:\n&amp;quot; + body);&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            llOwnerSay(&amp;quot;request body:\n&amp;quot; + body);&lt;br /&gt;
 &lt;br /&gt;
        //  if owner in sim&lt;br /&gt;
            if (ownerSize)//  != ZERO_VECTOR&lt;br /&gt;
            {&lt;br /&gt;
                llSetContentType(id, CONTENT_TYPE_HTML);&lt;br /&gt;
                llHTTPResponse(id, 200, HTML_BODY);&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                llSetContentType(id, CONTENT_TYPE_TEXT);&lt;br /&gt;
                llHTTPResponse(id, 200, &amp;quot;OK&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==辅助函数==&lt;br /&gt;
===JSON===&lt;br /&gt;
*LSL：http://wiki.secondlife.com/wiki/Category:LSL_JSON&lt;br /&gt;
*OSSL：http://opensimulator.org/wiki/OsParseJSONNew、http://opensimulator.org/wiki/OsParseJSON&lt;br /&gt;
&lt;br /&gt;
==服务器相关配置==&lt;br /&gt;
*Opensim.ini&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    ;# {HttpProxy} {} {Proxy URL for llHTTPRequest and dynamic texture loading} {} http://proxy.com:8080&lt;br /&gt;
    ;; Http proxy setting for llHTTPRequest and dynamic texture loading, if&lt;br /&gt;
    ;; required&lt;br /&gt;
    ; HttpProxy = &amp;quot;http://proxy.com:8080&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ;# {HttpProxyExceptions} {HttpProxy} {Set of regular expressions defining URL that should not be proxied} {}&lt;br /&gt;
    ;; If you're using HttpProxy, then you can set HttpProxyExceptions to a&lt;br /&gt;
    ;; list of regular expressions for URLs that you don't want to go through&lt;br /&gt;
    ;; the proxy.&lt;br /&gt;
    ;; For example, servers inside your firewall.&lt;br /&gt;
    ;; Separate patterns with a ';'&lt;br /&gt;
    ; HttpProxyExceptions = &amp;quot;.mydomain.com;localhost&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ;# {emailmodule} {} {Provide llEmail and llGetNextEmail functionality? (requires SMTP server)} {true false} false&lt;br /&gt;
    ;; The email module requires some configuration. It needs an SMTP&lt;br /&gt;
    ;; server to send mail through.&lt;br /&gt;
    ; emailmodule = DefaultEmailModule&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 ; By default, OpenSimulator does not allow scripts to make HTTP calls to addresses on the simulator's LAN.&lt;br /&gt;
    ; See the OutboundDisallowForUserScripts parameter in OpenSimDefaults.ini for more information on this filter.&lt;br /&gt;
    ; If you need to allow scripts to make some LAN calls use the OutboundDisallowForUserScriptsExcept parameter below.&lt;br /&gt;
    ; We recommend that you do not override OutboundDisallowForUserScripts directly unless you are very sure about what you're doing.&lt;br /&gt;
    ;&lt;br /&gt;
    ; You can whitelist individual endpoints by IP or FQDN, e.g.&lt;br /&gt;
    ;&lt;br /&gt;
    ; OutboundDisallowForUserScriptsExcept = 192.168.1.3:8003&lt;br /&gt;
    ; &lt;br /&gt;
    ; You can specify multiple addresses by separating them with a bar.  For example,&lt;br /&gt;
    ;&lt;br /&gt;
    ; OutboundDisallowForUserScriptsExcept = 192.168.1.3:8003|myinternalserver:8000&lt;br /&gt;
    ; &lt;br /&gt;
    ; If an address if given without a port number then port 80 is assumed&lt;br /&gt;
    ;&lt;br /&gt;
    ; You can also specify a network range in CIDR notation to whitelist, e.g.&lt;br /&gt;
    ;&lt;br /&gt;
    ; OutboundDisallowForUserScriptsExcept = 192.168.1.0/24&lt;br /&gt;
    ;&lt;br /&gt;
    ; to whitelist all ports on addresses 192.168.1.0 to 192.168.1.255&lt;br /&gt;
    ; To specify an individual IP address use the /32 netmask&lt;br /&gt;
    ;&lt;br /&gt;
    ; OutboundDisallowForUserScriptsExcept = 192.168.1.2/32&lt;br /&gt;
    ;&lt;br /&gt;
    ; See http://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing#CIDR_notation for more information on CIDR notation&lt;br /&gt;
&lt;br /&gt;
    ;# {HttpBodyMaxLenMAX} {} {Maximum bytes allowed for HTTP_BODY_MAXLENGTH} {} 16384&lt;br /&gt;
    ;; By default, llHTTPRequest limits the response body to 2048 bytes.&lt;br /&gt;
    ;; This limit can be extended using HTTP_BODY_MAXLENGTH to a maximum&lt;br /&gt;
    ;; of HttpBodyMaxLenMAX bytes. &lt;br /&gt;
    ;; Please be aware that the limit can be set to insanely high values,&lt;br /&gt;
    ;; effectively removing any limitation. This will expose your sim to a&lt;br /&gt;
    ;; known attack. It is not recommended to set this limit higher than&lt;br /&gt;
    ;; the highest value that is actually needed by existing applications!&lt;br /&gt;
    ;; 16384 is the SL compatible value.&lt;br /&gt;
    ; HttpBodyMaxLenMAX=16384&lt;br /&gt;
&lt;br /&gt;
    ;# {ExternalHostNameForLSL} {} {Hostname to use for HTTP-IN URLs. This should be reachable from the internet.} {}&lt;br /&gt;
    ;; Hostname to use in llRequestURL/llRequestSecureURL&lt;br /&gt;
    ;; if not defined - llRequestURL/llRequestSecureURL are disabled&lt;br /&gt;
    ExternalHostNameForLSL = ${Const|BaseHostname}&lt;br /&gt;
    &lt;br /&gt;
    ;# {shard} {} {Name to use for X-Secondlife-Shard header? (press enter if unsure)} {} OpenSim&lt;br /&gt;
    ;; What is reported as the &amp;quot;X-Secondlife-Shard&amp;quot;&lt;br /&gt;
    ;; Defaults to the user server url if not set&lt;br /&gt;
    ;; The old default is &amp;quot;OpenSim&amp;quot;, set here for compatibility&lt;br /&gt;
    ;; The below is not commented for compatibility.&lt;br /&gt;
    shard = &amp;quot;OpenSim&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ;# {user_agent} {} {User agent to report to web servers?} {} OpenSim LSL (Mozilla Compatible)&lt;br /&gt;
    ;; What is reported as the &amp;quot;User-Agent&amp;quot; when using llHTTPRequest&lt;br /&gt;
    ;; Defaults to not sent if not set here. See the notes section in the wiki&lt;br /&gt;
    ;; at http://wiki.secondlife.com/wiki/LlHTTPRequest for comments on adding&lt;br /&gt;
    ;; &amp;quot; (Mozilla Compatible)&amp;quot; to the text where there are problems with a &lt;br /&gt;
    ;; web server&lt;br /&gt;
    ; user_agent = &amp;quot;OpenSim LSL (Mozilla Compatible)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ;; The following 3 variables are for HTTP Basic Authentication for the Robust services.&lt;br /&gt;
    ;; Use this if your central services in port 8003 need to be accessible on the Internet&lt;br /&gt;
    ;; but you want to protect them from unauthorized access. The username and password&lt;br /&gt;
    ;; here need to match the ones in the Robust service configuration.&lt;br /&gt;
    ; AuthType = &amp;quot;BasicHttpAuthentication&amp;quot;&lt;br /&gt;
    ; HttpAuthUsername = &amp;quot;some_username&amp;quot;&lt;br /&gt;
    ; HttpAuthPassword = &amp;quot;some_password&amp;quot;&lt;br /&gt;
    ;;&lt;br /&gt;
    ;; Any of these 3 variables above can be overriden in any of the service sections.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*OpensimDefaults.ini&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    ; Maximum bytes allowed for HTTP_BODY_MAXLENGTH.&lt;br /&gt;
    ; By default, llHTTPRequest limits the response body to 2048 bytes.&lt;br /&gt;
    ; This limit can be extended using HTTP_BODY_MAXLENGTH to a maximum&lt;br /&gt;
    ; of HttpBodyMaxLenMAX bytes. &lt;br /&gt;
    ; HttpBodyMaxLenMAX=16384&lt;br /&gt;
&lt;br /&gt;
    ; Hostname to use in llRequestURL/llRequestSecureURL&lt;br /&gt;
    ; if not defined - llRequestURL/llRequestSecureURL are disabled   &lt;br /&gt;
    ; ExternalHostNameForLSL=127.0.0.1&lt;br /&gt;
&lt;br /&gt;
    ; Disallow the following address ranges for user scripting calls (e.g. llHttpRequest())&lt;br /&gt;
    ; This is based on http://en.wikipedia.org/wiki/Reserved_IP_addresses&lt;br /&gt;
    ; This stops users making HTTP calls to machines in the simulator's local network.&lt;br /&gt;
    ; If you need to allow some LAN calls we recommend you use OutboundDisallowForUserScriptsExcept documented in OpenSim.ini.example&lt;br /&gt;
    ; If you override OutboundDisallowForUserScripts directly you need to be very careful.&lt;br /&gt;
    ;&lt;br /&gt;
    ; Network ranges are specified in CIDR notation (http://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing#CIDR_notation) with multiple entries separated by |&lt;br /&gt;
    ; To specify an individual IP address use the /32 netmask (e.g. 192.168.1.3/32)&lt;br /&gt;
    ; You can also specify individual &amp;lt;addr&amp;gt;:&amp;lt;port&amp;gt; endpoints (e.g. 192.168.1.3:8003)&lt;br /&gt;
    ; If an address if given without a port number then port 80 is assumed.&lt;br /&gt;
    OutboundDisallowForUserScripts = 0.0.0.0/8|10.0.0.0/8|100.64.0.0/10|127.0.0.0/8|169.254.0.0/16|172.16.0.0/12|192.0.0.0/24|192.0.2.0/24|192.88.99.0/24|192.168.0.0/16|198.18.0.0/15|198.51.100.0/24|203.0.113.0/24|224.0.0.0/4|240.0.0.0/4|255.255.255.255/32&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Wyg</name></author>
		
	</entry>
</feed>