- 浏览: 198787 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
hao3721:
dsfasd
ehcache 使用 -
nihaokid:
方法是不会存在在对象内存中的,它存在于方法区,建议看看jvm的 ...
Java 深层理解 父类引用指向子类对象 -
vissalan:
有一点没看明白Father f1 = (Father)s;这时 ...
Java 深层理解 父类引用指向子类对象 -
咖啡舞者:
非常感谢这种分享精神.
在BREW中实现自己的GUI(8)-IWEB的封装 -
咖啡舞者:
这是创建的代码。
在设备上调的。
界面在手机和模拟器上显示的差异
概述
本文着重介绍了在1.1SDK中引入的IWEB接口,以及相关的IWebResp、IWebOpt、IwebUtil等API的使用方法。也包括各API的功能和与其他API(例如IHTMLVIEWER)的交互。
―――――――――――――――――――――――――――――――――――――――
基本作用
在BREW应用中,IWEB接口主要用于发起HTTP请求。在HTTP请求中,既可以通过“GET”方式获取文件,也可以通过“POST”方式上传数据,这两种方式IWEB都支持。IWEB管理自身的连接和套接字,因此更利于网络传输。
IWEB_GetPesponse函数用于开始网络传输。
Void IWEB_GetResponse(
Iweb * pIWeb,
IwebResp ** ppiwresp,
AEECallBack * pcb,
Const char * cpszUrl,
...
)
其中:
pIWeb 指向一个已实例化的IWeb对象的有效指针。
ppiwresp 指向IwebResp指针的有效指针。
pcb 指向一个已实例化的AEECallBack对象的有效指针。
cpszUrl 指向URL的指针。
... 是WebOpt中各项的名称和取值,成对排列,以WEBOPT_END结束。
注意:IwebResp指针不可以创建在在栈里。为了保证它在整个回调的过程中一直有效,创建在应用对应的结构体里比较好。
URL不可以包含任何保留字符。如果必须包含,请注意转换。详见本文 “在URL中使用保留字符”部分。
用IWeb请求一个文件,最简单的形式如下:
//Create IWeb instance
ISHELL_CreateInstance(pMe->a.m_pIShell,AEECLSID_WEB,(viod**)&pMe->m_pIWeb);
//Initialize the callback to WebReadCB
CALLBACK_Init(&pMe->m_Callback,WebReadCB,pMe);
//Request IWEB to fetch the URL
IWEB_CetResponse(pMe->m_pIWeb,(pMe->m_pIWeb,&pMe->m_pIWebResp,&pMe->m_Callback,http://www.qualcomm.com,WEBOPT_END));
注意此函数中参数传递的特殊语法。
IWEB和服务端URL“www.qualcomm.com”建立一个网络连接,并请求得到文件。当IWEB引擎获得了来自服务端的响应,它会通过pcb传递给AEECallBack中的回调函数。如果请求文件的方式没有指定,默认为“GET”。请求文件的方式以及其他选项的设置方法,参见本文的“IWEB_GetResponse请求中WebOpts的设置”。
WebRespInfo结构体中包含了响应的消息体和其他相关信息(比如错误号、长度、类型等),所以,可以通过IWEB_GetInfo函数解析WebRespInfo取得响应的内容。具体参见本文的“如何理解WebRespInfo中的错误号”部分。
//Callback
static void WebReadCB(void * cxt)
{
...
//get information about the response
WebRespInfo * pWebRespInfo = IWEBRESP_GetInfo(pMe->m_pWebResp);
//the body of the response is contained in the ISOURCE
ISource * pISource = pWebRespInfo->pisMesssage;
}
―――――――――――――――――――――――――――――――――――――――
IWEB_GetResponse请求中WebOpts的设置
前面,我们已经了解用IWEB开始一个简单的HTTP传输的方法,现在通过学习WebOpts的使用,将我们对IWEB接口的了解深入一步。
一个WebOpt包含两项内容:选项名称及其取值。这些WebOpt应该被加入到IWeb_GetResponse函数中,用于配置将要发出的请求。WebOpt可以以两种方式添加:
使用IWEB_AddOpt
以这种方式添加的选项是永久的——只要IWeb对象没有释放,这个设置一直有效。
int i = 0;
WebOpt awo[10];
//Add handler data
awo[i].nId = WEBOPT_HANDLERDATA;
awo[i].nVal = (void*)pMe;
i++;
//add the handler function for status callbacks
awo[i].nId = WEBOPT_STATUSHANDLER;
awo[i].nVal = (void*)WebStatusNotification;
i++;
//add the option stating which method
awo[i].nId = WEBOPT_METHOD;
awo[i].nVal = (void*)”GET”;
i++;
//marks the end of the arrary of WebOpts
Awo[i].nId = WEBOPT_END;
//add options
IWEB_AddOpt(pApp->m_pIWeb,awo);
IWeb_GetResponse(pMe->m_pIWeb,(pMe->m_pIWeb,&pMe->m_pIWebresp,&pMe->m_Callback,”thhp://webber.qualcomm.com”,WEBOPT_END));
直接添加
WebOpt的选项名和值可以在IWeb_GetResponse函数中直接设置:
IWeb_GetResponse(pMe->m_pIWeb,(pMe->m_pIWeb,&pMe->m_pIWebresp,&pMe->m_Callback,”http://webber.qualcomm.com”,
WEBOPT_HANDLERDATA,pMe,
WEBOPT_STATUSHANDLER,WebStatusNotification,
WEBOPT_METHOD,”GET”,
WEBOPT_END));
这种方式添加的设置,只在这个IWeb_GetResponse中有效。
注意:不管以哪种方式添加,请求的设置应该在整个回调的过程中保持有效。若想设置被自动复制到需要的地方,在选项列中添加WEBOPT_COPYOPTS。
有时候,AEEWeb.h文件中的解释比API帮助中的更加详细。常用的WebOptions和解释如下:
WEBOPT_METHOD:设定使用“GET”或者“POST”方式。
取值:GET、POST。
WEBOPT_BODY:用于设置POST的消息体。
WEBOPT_CONNECTTIMEOUT:设置在尝试成功建立连接的过程中,IWeb需要等待的时间。时间到则放弃连接,并返回连接错误号。以毫秒计算,默认值为AEENet的连接时长。设为0表示使用系统默认值,-1表示无穷大。这个值要足够一次成功的连接。假设成功建立了连接,服务器响应却比较缓慢,在这个过程中,IWeb不可以报“连接超时”。可以根据需要使用IShell_SetTimer。
WEBOPT_IDLECONNTIMEOUT:一个空闲连接保持的时间,此时间到,则关闭连接。默认值为InetMgr中PPP的连接时间,设为-1表示无穷大。
WEB_HEADER:设置特殊的http消息头,由CRLF组成。CRLF是指单独列出的名称和取值,例如:”Name1:v1\r\nName2:v2\r\n”。
WEBOPT_PROXYSPEC:用于设置代理。详见《BREWWebProxySpecKnowledgeBase》。
WEBOPT_FLAGS:这个设置会影响底层协议引擎的行为。这些标志使我们在使用连接时取得更多的控制权。已实现的标志如下:
WEBREQUEST_NOKEEPALIVE:IWeb不会刻意地保持连接。在数据交换结束后立即释放连接。默认情况下,IWeb尽力保持连接。
WEBREQUEST_FORCENEWCONN:在已经和某服务器已经建立连接后,每次连接这个服务器,IWeb都会重新建立一个连接,而不沿用以前的连接。这样做,您将承担以下风险:手机上没有空闲套接字可用、传输失败。默认情况下,IWeb会重复利用已有的连接。
WEBREQUEST_NOWAITCONN:如果没有可用的连接,建立新连接。通常情况下,如果已有一个连接正在工作,IWeb会等待这个连接释放,然后建立新的。如果设置这个标志,IWeb会立刻建立新连接。
其他选项的详细信息,参见AEEWeb.h。
―――――――――――――――――――――――――――――――――――――――
如何理解WebRespInfo中的错误号?
发送请求给服务器,得到服务器的响应,我请求的结果在那里?上面提到过,回调中包含一个指向IwebResp对象的指针。可以通过如下方法从IwebResp中得到信息:
//callback
static viod WebReadCB(viod*cxt)
{
…
//get information about the response
WebRespInfo * pWebRespInfo = IWEBRESP_GetInfo(pMe->m_pIWebResp);
…
}
pWebRespInfo->nCode包含响应的状态:成功或者失败。正数1代表由服务器返回,负数代表系统错误,参见AEEError.h。为了理解nCode的意思,可以使用以下宏:
WEB_ERROR_SUCCESSED(nCode):这个宏在传输成功时返回TRUE。
WEB_ERROR_MAP(nCode):如果是HTTP错误,返回WEB_ERROR_PROTOCOL系列错误号。错误号对应的意思参见AEEWeb.h或者RFC2626。
检查响应的状态和消息头
如果有需要,查看来自服务器的响应的消息头是很容易实现的。在响应中设置WEBOPT_HEADERHANDLER和WEBOPT_STATUSHANDLER即可。这些选项为相应的消息头和状态设置了回调函数。
用法:
IWEB_GetResponse(pApp->m_pIWeb,(pApp->m_pIWeb,&pwa->piWResp,&pwa->cb,pszUrl,
WEBOPT_HEADERHANDLER,WebAction_Header,
WEBOPT_STATUSHANDLER,WebAction_Status,
WEBOPT_END));
WebAction_Header属于PFNWEBHEADER类型,WebAction_Status属于PFNWEBSTATUS类型。更多信息参见API帮助文档。
―――――――――――――――――――――――――――――――――――――――
发起HTTP的POST请求
HTTP的POST请求是指:把数据上传到服务器。IWeb要先准备好上传的数据流。
// set up the callback
CALLBACK_Init(&pMe->m_Callback, WebReadCB, pMe);
// Create a Source Util object which will create an ISource object
// from a buffer, file, socket, etc.
ISHELL_CreateInstance(pMe->a.m_pIShell, AEECLSID_SOURCEUTIL, (void
**)&pMe->m_pISourceUtil);
// Create ISOURCE object
ret = ISOURCEUTIL_SourceFromMemory(pMe->m_pISourceUtil,
pMe->m_szData, // data in buffer
pMe->m_nContentLength, // length of data
NULL,// No callback
NULL,
&pMe->m_pISource //object to be created
);
// Kick off the transaction
IWEB_GetResponse(pMe->m_pIWeb,
(pMe->m_pIWeb,
&pMe->m_pIWebResp,
&pMe->m_Callback,
pMe->m_pURL,
WEBOPT_METHOD, "POST", // Set method to POST
WEBOPT_BODY, pMe->m_pISource, // Set body of message
// to ISOURCE object
WEBOPT_CONTENTLENGTH, pMe->m_dwContentLength,
WEBOPT_END));
跟“GET”请求类似,回调函数必须有正确的代码和数据才可以被调用。
注意:在BREW1.x和2.0中,如果POST的消息体很长会出问题。
―――――――――――――――――――――――――――――――――――――――
在URL中使用保留字符
在HTTP请求中,URL中不能含有保留字符。如果不可避免,在发出请求之前,URL得被译码成为可接受的格式——使用IWEB_UrlEncode。
char * IWEBUTIL_UrlEncode
(
IWebUtil * pIWebUtil,
const char * cpcIn,
int * pnInLen,
char * pcOut,
int * pnOutLen
)
这个方法可以根据RFC2936译出一个包含URL的字符串。
注意:只对URL后缀中的保留字符重新译码,而不是整个URL。
假设URL像这样:“http://www.qualcomm.com/test?param1=x”只译码“test?param1=x
”部分。用例如下:
// Determine what the length of the output buffer needs to be
IWEBUTIL_UrlEncode(pMe->m_pIWebUtil,
(const char *)(buf), // buffer containing the suffix
// of URL with reserved chars
&nDataLen, // number of characters to be
encoded
NULL, // if NULL, method calculates
//size of buffer needed
&pMe->m_dwContentLength // contains the length
// of the buffer required
);
// Allocate space to hold the encoded string
if(pMe->m_dwContentLength)
pMe->m_szData = (char*) MALLOC(pMe->m_dwContentLength);
// Encode the string.
IWEBUTIL_UrlEncode(pMe->m_pIWebUtil, (const char *)(buf), &nDataLen,
pMe->m_szData, &pMe->m_dwContentLength);
译码后的字符串类似于“test%3Fparam1%3Dx%0”。
m_szData包含译码后的URL后缀。需要和URL的前部分连接起来,才可以用于IWEB_GetResponse。
保持连接和连接缓存
HTTP1.1引入了通过Keep-Alives使连接持久的概念。IWeb利用了这一特点,并作为默认设置。用WEBREQUEST_NOKEEPALIVE WEBOPT_FLAG可以取消。
如果应用请求服务器www.qualcomm.com/index.html,IWeb建立一个到此地址的连接。请求得到响应后,IWeb并不关闭连接,而是加入缓存。如果又有需要连接到同一服务器的请求,例如www.qualcomm.com/developer.html,IWeb会重用这个连接。这一功能可以通过WEBOPT_FLAGS关闭。
尽管如此,持久连接也是受限的。Keepalives取决于消息头中Content-Length的内容。在一个有效的“Content-Length:xxx”消息头中,只能包含“Connection:Keep-Alive”。如果想告知对方何时停止读数据流,就得传送内容长度(不送Connection:Keep-Alive),连接就断了。
由于很难或者说根本不可能提供一个“Content-Length:xxx”的有效消息头,大部分服务器在提供了CGI或其他动态内容后,回到“Connection:Close”。
就算有效的内容长度消息头存在,服务器也可以在任何时间关闭连接。这是HTTP标准的一部分。根本没有办法来确保一个持久的连接。
―――――――――――――――――――――――――――――――――――――――
巧用IWEBUTIL_ParseFormFields
当应用中需要收集用户的信息并把它传送到服务器时,这个方法特别好用。
BREW应用可以利用IHTMLViewer接口在手机上显示HTML表格。用户可以在这个表格里输入必要的信息。这些信息可能要被传送到服务器,也可能应用要利用这些信息实现用户要求的功能。
比如,一个文本框用于用户输入铃声的名字。这个信息也许会被传送到服务器去查找相应的铃声文件。在同一张表中,也许还有个音量的多选框,让用户选择铃声播放的音量。这个信息不必送到服务器,应用会根据它来改变自身相应的功能。
当用户点表单的提交按钮时,HVN_SUBMIT就会连同URL一起,被传送给HTMLViewer的回调函数。其中,URL的后缀包含表域及其内容。
name1=value1&name2=value2&name3=value3& ...
或
name1=value1;name2=value2;name3=value3; ....
IWEBUTIL_ParseFormFields可以从这个后缀中得到各表域和值,具体如下:
假设传递到回调函数的URL如下:
request:ringer?ringer=Sacrifice&volume=50
//find the suffix
pszIter = STRCHREND(pszIter, '?');
if (*pszIter)
++pszIter;
{
IWebUtil *piwu;
WebFormField wff[4]; // Create an array of WebFormField structs
ISHELL_CreateInstance(pApp->a.m_pIShell, AEECLSID_WEBUTIL,
(void **)&piwu)) ;
// This populates the WebFormField structs with a maximum of 4 fields
IWEBUTIL_ParseFormFields(piwu,&pszIter,wff,4,0);
IWEBUTIL_Release(piwu);
piwu = 0;
}
现在,表域的名称和值都包含在WebFormFields中了。
发表评论
-
手机开发平台指南、教程和资料介绍(转载)
2009-05-13 15:58 2614欢迎转载,转载请注明出处。作者:手机即信息 博客:http:/ ... -
Brew中的Module的实现方法
2009-05-13 14:36 1239Brew中的Module的实现方法: 【原创作者:sho ... -
Brew常见错误整理
2009-05-07 16:26 12811.用户是否可以将信息上传到开发商的服务器上来?用户传上来 ... -
BREW-教你设计用户界面
2009-04-24 16:14 1988这个书高通下的pdf, ... -
AppLoader的使用
2009-04-24 16:12 2687AppLoader是Brew Tools Suite3.0. ... -
程序在模拟器中的调试
2009-04-24 16:11 1241通过高通的FAQ知道:DBGPRINTF可以在vc的调试窗口和 ... -
程序在手机上的调试
2009-04-24 16:11 1098仍然通过高通的FAQ知道:DBGPRINTF的内容,当 ... -
浅谈ISocket的使用
2009-04-24 16:10 1813环境:brew sdk3.0中文版 + vc6.0 ... -
WEBOPT中http代理的设置
2009-04-24 16:09 1205原代码如下: awo[i].nId = WEBOPT_ ... -
关于音频的播放
2009-04-24 16:06 1477先了解一下brew中可以 ... -
关于文件的读写
2009-04-24 16:05 2276brew中对文件操作需要 ... -
界面在手机和模拟器上显示的差异
2009-04-24 16:04 1753高通告诫我们:程序一定要多多在手机上调试。 刚入门时 ... -
在BREW中实现自己的GUI(8)-IWEB的封装
2009-04-13 17:43 2050封装IWeb其实并不算是GUI的范畴,但是一并说了罢。在BRE ... -
在BREW中实现自己的GUI(7)-动态效果的实现
2009-04-13 17:41 1773今天讨论关于GUI的另一个话题:如何在两个界面切换中表现出比较 ... -
在BREW中实现自己的GUI(6)-单选框与复选框的实现
2009-04-13 17:40 1564还有一个常用的UI控件是单选框与复选框。可惜BREW也不提供, ... -
在BREW中实现自己的GUI(5)-滚动条的实现
2009-04-13 17:38 1291前面做IGStatic时我们用到了一个滚动条组件IGScrol ... -
在BREW中实现自己的GUI(4)-IGStatic的实现
2009-04-13 17:37 1609BREW中的IStatic可以方便地显示一个文本,但是它没有背 ... -
在BREW中实现自己的GUI(3)-做一个跑马灯的效果
2009-04-13 17:37 1680有时如果我们在应用中需要提供一个滚动的信息提示条(类似于页面上 ... -
在BREW中实现自己的GUI(2)-TabPane的实现
2009-04-13 17:35 1293同样是定义一下几个实体结构: //自定义菜单项type ... -
在BREW中实现自己的GUI(1)-图形化菜单的实现
2009-04-13 17:34 2233要实现的菜单比较简单,只支持列表视图,也就是IMenuCtl中 ...
相关推荐
总的来说,iwebsns_v1.1.0 iWeb社区不仅是一个强大的社交平台,也是开发者展现创意和技术实力的舞台。无论是为了建立一个互动性强的社区,还是希望通过二次开发实现独特功能,iwebsns_v1.1.0都能提供坚实的基础和...
iWebSNS v1.1.0 正式版简体中文版是一款强大的社交网络服务(SNS)软件,专为处理大规模并发和高负载场景而设计。它以开源的形式提供,意味着用户可以自由地查看、修改和分发源代码,从而适应各种定制需求。这款软件...
作为一款大型高并发高负载的开源SNS(社交网络服务)软件,iwebSNS功能强大,易于扩展,具有良好的伸缩性和稳定性。 它基于iweb SuperInteraction(简称iweb SI)框架开发。借助iwebSI平台,站点可以轻松获得支持热插拔...
总之,iWebSNS是一个强大的社交网络构建工具,它的开源性质使得开发者可以自由地探索和创新,为构建自己的社交网络平台提供了一个坚实的基础。如果你对社交网络服务感兴趣,那么这个项目绝对值得你投入时间和精力去...
10. **API接口**:iWebSNS提供API接口,与其他系统集成,实现数据互通,例如与移动应用对接,拓展社区功能。 **PHP技术在iWebSNS中的应用:** PHP作为开源的服务器端脚本语言,以其易学易用、性能良好和跨平台的...
通过深入理解BREW和IWeb,开发者可以创建出高效、功能强大的无线应用,满足用户在移动设备上发送和接收短信的需求。这个压缩包中的“sms”文件可能包含了相关的源代码、配置文件或其他支持材料,对于想要学习或研究...
总结起来,iWebSNS社交网络平台是一个强大的开源工具,它提供了一整套社交网站构建方案,涵盖了用户互动、内容分享、社区管理等多个方面。通过理解和掌握这个平台,无论是初学者还是经验丰富的开发者,都能创建出...
作为一款大型高并发高负载的开源SNS(社交网络服务)软件,iwebSNS功能强大,易于扩展,具有良好的伸缩性和稳定性。 它基于iwebSuperInteraction(简称iwebSI)框架开发。借助iwebSI平台,站点可以轻松获得支持热插拔及...
iWebAx开源项目iWeb SNS 是一款功能强大且易于扩展的LAMP开源SNS(社交网络)软件。 iWeb SNS作为一款大型高并发高负载的开源SNS软件,它基于iweb SuperInteraction(简称iweb SI)框架开发。借助iwebSI平台,站点...
作为一款大型高并发高负载的开源SNS(社交网络服务)软件,iwebSNS功能强大,易于扩展,具有良好的伸缩性和稳定性。 它基于iweb SuperInteraction(简称iweb SI)框架开发。借助iwebSI平台,站点可以轻松获得支持热插拔...
iWeb开源三剑客是针对Web开发的一组高效、便捷的工具集合,旨在提供全面的Web应用程序解决方案。其中,iWebIM是这个系列中的重要组件,专注于即时通讯(Instant Messaging)功能,允许用户在Web环境下实现顺畅的聊天...
iWebAx开源项目iWeb SNS 是一款功能强大且易于扩展的LAMP开源SNS(社交网络)软件。 iWeb SNS作为一款大型高并发高负载的开源SNS软件,它基于iweb SuperInteraction(简称iweb SI)框架开发。借助iwebSI平台,站点...
作为一款大型高并发高负载的开源SNS(社交网络服务)软件,iwebSNS功能强大,易于扩展,具有良好的伸缩性和稳定性。 它基于iwebSuperInteraction(简称iwebSI)框架开发。借助iwebSI平台,站点可以轻松获得支持热插拔及...
该软件的核心特性在于其强大的功能和易集成性,使得它能够无缝地融入各种现有的社区系统,极大地提升了用户体验。 首先,我们要了解WebIM的概念。Web即时通讯(Web Instant Messaging)是指通过网页实现用户间的...
目前政府信息化,办公自动化正如火如荼的... 提供Web方式的VBA接口,可以通过Javascript/Vbscript操作Word/Excel,就像VBA一样。 系统二次开发 提供强大的函数库,支持多种系统环境,多种开发语言,多种数据库。
综上所述,金格iWebOffice提供了一个强大且用户友好的在线文档编辑平台,适用于各种企业和组织,尤其适合需要高效率、安全性和协作性的电子政务和办公自动化环境。其全面的功能和易用性使得文档管理变得更加便捷和...
金格科技于2003年开始对多种格式的...扩展功能采用对象化开发模式,提供强大易用接口、编辑器软件接口,客户可随业务需求实现多种应用,无所不能。这一切改变,让iWebOffice2015再一次完成全新进化,成为全能之王。
总的来说,iWebShop 2.3.11113010是构建大型电商平台的理想选择,它结合了iWeb SI的强大性能和前端模板的灵活性,为商家提供了稳定、高效、易用的电商解决方案。无论是对于初创公司还是已有一定规模的企业,这款软件...