LlRequestURL
首页 | 函数 | 事件 | 类型 | 操作符 | 常数 | Flow Control | Script Library | Categorized Library | Tutorials |
函数名 |
---|
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 |
相关事件 |
---|
无 |