LlRequestURL

来自人工智能助力教育知识百科
Mkx讨论 | 贡献2020年8月6日 (四) 03:36的版本 (创建页面,内容为“{{LSL Header|ml=*}}{{LSLC|Keywords}}{{LSLC|Flow Control}}{{LSLC|}} {{函数详情 |函数名 = Function:key llRequestURL( ); |参数= 参数: |返回值= 返回…”)
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳转至: 导航搜索

Template:Needs Translation/


函数名
Function:key llRequestURL( );
参数:
返回值:请求此脚本使用一个HTTP:// url。http_request event由请求的结果触发。

返回a handle (a key) ,用于识别http_request event中的请求结果。

注意事项
http -in不在通常的http端口号上;它在http_request事件中提供的url包含正确的端口号。

你的脚本(和任何使用它的客户端)不应该“验证”提供的URL;特别地,不要假设它映射到任何特定的地址,或者在任何特定的域中。在“第二人生”进入云计算的过程中,这些将会发生变化,在“第二人生”进入云计算之后,这些变化可能会更加动态。

这个函数的使用是被限制的。虽然它没有强制休眠时间,但是在短时间内如果有太多的请求(5个左右),将会导致所有进一步的请求被拒绝,直到脚本停止url请求至少1秒。在每个请求之间使用0.6秒或更长的llSleep将防止您被throttled。

当(重新)启动一个区域时,所有 HTTP server URLs都会自动释放并失效。

 使用CHANGED_REGION_START检测,这样就可以请求新的URL。

可用url的数量是有限的资源,也就是说,脚本只能有这么多开放的url。

当放弃一个URL时,用llReleaseURL释放它,以避免泄漏。重新设置脚本或删除prim也足以释放url。

listeners不同,url的持久性跨越状态更改

示例
HTTP Server URL Registration 中可以找到一个完整的示例,该示例展示了如何获取URL、向外部客户端注册该URL,并进行适当的回退和重试以联系外部服务。

该脚本在区域重启后请求一个新URL。 请参阅讨论页面,以了解为什么这个特定的脚本不需要使用llReleaseURL()。

string url;
key urlRequestId;
 
default
{
    state_entry()
    {
	urlRequestId = llRequestURL();
    }
    on_rez(integer start_param)
    {
	llResetScript();
    }
 
    changed(integer change)
    {
	if (change & (CHANGED_OWNER | CHANGED_INVENTORY))
		llResetScript();
 
	if (change & (CHANGED_REGION | CHANGED_REGION_START | CHANGED_TELEPORT))
		urlRequestId = llRequestURL();
    }
 
    http_request(key id, string method, string body)
    {
	if (id == urlRequestId)
	{
	    if (method == URL_REQUEST_DENIED)
		llOwnerSay("The following error occurred while attempting to get a free URL for this device:\n \n" + body);
 
	    else if (method == URL_REQUEST_GRANTED)
	    {
		url = body;
		llLoadURL(llGetOwner(), "Click to visit my URL!", url);
	    }
	}
    }
}

重要的是要记住,如果您请求另一个URL,旧的URL将不会被释放,它将保持活动状态。下面的脚本说明了这一点。 如果您可以在您的土地上使用所有url,请尝试以下代码。删除prim/脚本将释放之前分配的所有url。

//警告:
//
//此脚本仅用于概念验证(演示目的)。
//不要使用它,如果你没有sim卡所有者和/或
//地产管理器可以测试此脚本。
//这个脚本可能会阻止来自sim和与sim之间的HTTP通信。
/ /……关闭所有联网的供应商和/或类似的机器。
//
//此脚本分配所有可用的url。
//删除脚本和/或取消包含脚本的对象,
//将释放所有以前获取的url。
default
{
    state_entry()
    {
        llRequestURL();
    }
 
    http_request(key id, string method, string body)
    {
        if (method == URL_REQUEST_DENIED)
            llSetText("No free URLs!", <1.0, 0.0, 0.0>, 1.0);
 
        else if (method == URL_REQUEST_GRANTED)
        {
            llSetText( (string)llGetFreeURLs() + " URLs left\n" + body, <1.0, 1.0, 1.0>, 1.0);
 
            llRequestURL();
        }
        else if (method == "GET")
            llHTTPResponse(id, 200, "Hello there!");
    }
}
如您所见,此脚本将使用您土地上所有可用的url,因为它在请求新url之前不会删除旧url。
只需将旧URL存储在一个全局变量中,然后用[[llReleaseURL]]释放它。
相关函数
llRequestSecureURL

llGetFreeURLs

llReleaseURL

llHTTPResponse

llGetHTTPHeader

相关事件