Corona中文站

强大、易学的跨平台(iOS/Android)开发框架。QQ群1:74390406(满) 群2:221929599

导航

五分钟学会Corona(二十) - 异步HTTP
该特性允许你发起异步的HTTP和HTTPS/SSL调用,任何有效的HTTP方法(“GET”,“POST”等等),以及添加自定义的 header和body content。你的 Corona程序不需要停止, 等到服务器的响应到来时,通过event listener来捕获并且从event中取得数据。

另外,你可以选择下载网络响应到一个特定的文件,而不是加载到内存中。当这个响应是一个很大的文档或一个图片时,是很有用的。

两个新的例子工程说明了该特性的用法: "Network/AsynchHTTP" 和 "Network/AsynchImageDownload".

注意:在此功能的预发布版本中,你必须显式require内部的“network”库到你的代码中,但是现在这个库是自动被包含的。

Note: in a prerelease version of this feature, you had to explicitly require the internal "network" library in your code, but this library is now included automatically. The examples below are modified accordingly.

网络请求

为了发送一个到服务器的请求,指定一个URL,一个method,和一个获取结果的listener。

network.request( url, method, listener [, params] )

如果没有指定的method的话,默认method是"GET"。

结果event有下列属性:

• event.response -- 一个包含从服务器来的响应内容的字符串。

• event.isError -- 一个布尔值:网络有错误的情况下为true,否则false。


有一个工作例子,其通过SSL连接google的加密搜索,并打印响应(主页的源代码)到Corona控制台:

local function networkListener( event )

if ( event.isError ) then

print( "Network error!")

else

print ( "RESPONSE: " .. event.response )

end

end



-- Access Google over SSL:

network.request( "https://encrypted.google.com", "GET", networkListener )


有时候,你可能希望指定附加的header,或者在请求中包含一个body。通过可选的params table参数,都可以做到,params包含如下因素:

params.headers -- 用字符串键指定header的一个table。params.body -- 一个包含HTTP body的字符串。

header table的例子(这些被附加到任何ios已经发送的header上):

headers = {}



headers["Content-Type"] = "application/json"

headers["Accept-Language"] = "en-US"



headers.body = "This is an example request body."


网络下载

这个API有点类似于前面的,除此以外,它下载响应内容到你指定文件路径的本地文件中,而不是缓存在内存中。推荐用于大的响应(例如,很大的XML文档),也能被用于下载远程图片。

network.download( url, method, listener [, params], destFilename [, baseDir] )

如果没有method被指定 ,默认的method是“GET”。可选的 baseDir参数既可以是 system.DocumentsDirectory(默认),也可以是 system.TemporaryDirectory。

结果event中包含下列属性:

• event.response -- 一个包含目的文件名的字符串。如果你正在为各种文件下载,写一个通用的事件处理器,这会很有用。

• event.isError -- 一个布尔值:true意味着网络错误,反之则false。


下面的例子下载了一个远程图片到本地文件拷贝,并且将其显示在屏幕上:

local function networkListener( event )

if ( event.isError ) then

print ( "Network error - download failed" )

else

myImage = display.newImage( "helloCopy.png", system.TemporaryDirectory, 60, 40 )

myImage.alpha = 0

transition.to( myImage, { alpha = 1.0 } )

end



print ( "RESPONSE: " .. event.response )

end



network.download( "http://developer.anscamobile.com/demo/hello.png", "GET", networkListener, "helloCopy.png", system.TemporaryDirectory )


显示远程图片

这个API可以很方便的访问远程图片,并且作为一个可见的display object返回。它有点类似于 network.download()这个API(实际上,其背后也是使用这个),但是编码更加简单。

display.loadRemoteImage( url, method, listener [, params], destFilename [, baseDir] [, x, y] )

如果没有method被指定,默认方法是“GET”。可选的baseDir参数也可以是system.DocumentsDirectory (默认) 或 system.TemporaryDirectory.

结果event有下列属性:

• event.response -- 一个包含目的文件名的字符串。如果你正在为各种文件下载,写一个通用的事件处理器,这会很有用。

• event.target -- 当图片被下载完之后,创建的新的display object。

• event.isError -- 一个布尔值:true意味着网络错误,反之则false。



下面的例子下载了一个远程图片到本地文件拷贝,并且将其显示在屏幕上:

local function networkListener( event )

if ( event.isError ) then

print ( "Network error - download failed" )

else

event.target.alpha = 0

transition.to( event.target, { alpha = 1.0 } )

end



print ( "RESPONSE: " .. event.response )

end



display.loadRemoteImage( "http://developer.anscamobile.com/demo/hello.png", "GET", networkListener, "helloCopy.png", system.TemporaryDirectory, 60, 280 )
<< 五分钟学会Corona(十九) - OpenFeint五分钟学会Corona(二十一) - 应用内支付 >>

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

最近发表

Powered By Z-Blog 1.8 Walle Build 100427 Copyright 2011-2015 BuildApp.Net. All Rights Reserved.