类型 函数 库 network.* 返回值 用户数据 修订 版本 2024.3703 关键词 异步, http, https, get, post 另请参阅 network.download() network.upload() network.cancel() networkRequest
向 URL 发起异步 HTTP 或 HTTPS 请求。此函数返回一个句柄,可以将其传递给 network.cancel() 以取消请求。
您不能在 applicationSuspend
或 applicationExit
事件 期间执行网络请求。当您的应用程序挂起时,不会触发任何回调。您可以通过在挂起时将您希望发出的请求保存到文件来解决此问题。然后,在 applicationResume
事件 中,检查是否有保存的待处理请求,如果有,则执行它。
请求的 Content-Type
默认为 text/plain
。如果您正在 POST
表单数据,则必须适当地设置它
Cookie 在所有设备上的处理方式可能不同。例如,某些 Android 设备将需要应用程序代码来正确处理某些 Web 登录方案,尤其是在它们使用重定向的情况下。
网络请求在失败时不会引发运行时错误,因此无需将它们包装在 Lua pcall()
语句中(错误将在发送到网络侦听器的事件中报告)。
在 Android 上,您必须将 INTERNET
权限添加到 build.settings
文件中。
settings = { android = { usesPermissions = { "android.permission.INTERNET", }, }, }
network.request( url, method, listener [, params] )
字符串。 HTTP 请求 URL。
字符串。 HTTP 方法;可接受的值为 "GET"
(默认)、"POST"
、"HEAD"
、"PUT"
和 "DELETE"
。
侦听器。 在 HTTP 操作的各个阶段调用的侦听器函数。这将传递一个 networkRequest 事件。
侦听器函数可以接收以下阶段的事件
"began"
— 第一个通知,包含估计大小(如果已知)。"progress"
— 中间进度通知。"ended"
— 最终通知,请求完成时。默认情况下,侦听器将仅接收 "ended"
事件。如果 params.progress
(见下文)为 "upload"
或 "download"
,则侦听器还将接收 "began"
和 "progress"
事件。
如果响应体通过使用`params.response`定向到文件,并且响应已成功写入文件,则`event.response`将包含一个指示输出文件的`filename`和`baseDirectory`的表。如果请求完成,但产生错误响应,则任何错误响应体都将作为字符串提供在`event.response`中。此行为可防止目标文件被错误响应写入/覆盖,而不是所需的有效负载。
表。 指定 HTTP 请求或响应处理选项的表,包括自定义请求标头或正文。支持以下键
headers
— 使用字符串键指定请求标头值的表。body
— 包含请求正文的字符串,或者,包含`filename`和可选的`baseDirectory`的表,用于指定文件的内容将用作请求正文。bodyType
— 指示字符串请求正文是`“text”`还是`“binary”`的字符串。如果 `params.body` 是字符串,则默认为 `“text”`;如果它是一个指定文件的表,则默认为 `“binary”`。progress
— 字符串值,指示所需的进度通知类型(如果有)。可以是`“upload”`或`“download”`。通知阶段包括所需进度方向的`“began”`和`“progress”`阶段事件。默认为`nil`,表示只希望`“ended”`阶段事件。response
— 表值,指示响应体应写入文件,并指定响应文件的 `filename` 和可选的 `baseDirectory`。如果未提供此值,则响应体将作为字符串提供。timeout
— 超时时间(秒)。默认为 30 秒。handleRedirects
一个布尔值,指示是否需要自动重定向处理(默认)。如果您希望接收 302 响应并自行处理它们,请将其设置为 `false`。某些类型的登录方案或自定义 Cookie 处理可能需要这样做。请注意,如果在 `params.body` 或 `params.response` 中指定了 `filename` 表,则 `baseDirectory` 是一个可选的 常量,默认为 system.DocumentsDirectory。在 `params.response` 的情况下,`baseDirectory` 不能设置为 system.ResourceDirectory,因为该目录是
-- The following sample code contacts Google's encrypted search over SSL -- and prints the response (in this case, the HTML source of the home page) -- to the console. local function networkListener( event ) if ( event.isError ) then print( "Network error: ", event.response ) else print ( "RESPONSE: " .. event.response ) end end -- Access Google over SSL: network.request( "https://encrypted.google.com", "GET", networkListener )
-- The following code demonstrates sending data via HTTP POST, -- specifying custom request headers and request body. local function networkListener( event ) if ( event.isError ) then print( "Network error: ", event.response ) else print ( "RESPONSE: " .. event.response ) end end local headers = {} headers["Content-Type"] = "application/x-www-form-urlencoded" headers["Accept-Language"] = "en-US" local body = "color=red&size=small" local params = {} params.headers = headers params.body = body network.request( "http://127.0.0.1/formhandler.php", "POST", networkListener, params )
-- The following code demonstrates how to download a file, with progress updates. local function networkListener( event ) if ( event.isError ) then print( "Network error: ", event.response ) elseif ( event.phase == "began" ) then if ( event.bytesEstimated <= 0 ) then print( "Download starting, size unknown" ) else print( "Download starting, estimated size: " .. event.bytesEstimated ) end elseif ( event.phase == "progress" ) then if ( event.bytesEstimated <= 0 ) then print( "Download progress: " .. event.bytesTransferred ) else print( "Download progress: " .. event.bytesTransferred .. " of estimated: " .. event.bytesEstimated ) end elseif ( event.phase == "ended" ) then print( "Download complete, total bytes transferred: " .. event.bytesTransferred ) end end local params = {} -- Tell network.request() that we want the "began" and "progress" events: params.progress = "download" -- Tell network.request() that we want the output to go to a file: params.response = { filename = "solar.jpg", baseDirectory = system.DocumentsDirectory } network.request( "http://docs.solar2d.cn/images/simulator/image-mask-base2.png", "GET", networkListener, params )
-- The following code demonstrates an HTTP post, where the request body is text from a file. -- This example demonstrates just one possible way to upload a file. Different web servers -- and applications support different methods of file upload. For example, some REST services -- support upload of a binary file in the body of a PUT request. Many web servers only allow -- file uploads using multipart/form-encoded (text) request bodies in a POST request. If you -- are going to attempt file upload, you must first understand the specific mechanism -- supported by the specific web server or application that you will be working with, -- then you must form your request data and choose your request method appropriately. local function networkListener( event ) if ( event.isError ) then print( "Network error: ", event.response ) else print ( "Upload complete!" ) end end local headers = {} headers["Content-Type"] = "application/json" headers["X-API-Key"] = "13b6ac91a2" local params = {} params.headers = headers -- Tell network.request() to get the request body from a file: params.body = { filename = "object.json", baseDirectory = system.DocumentsDirectory } network.request( "http://127.0.0.1/restapi.php", "POST", networkListener, params )