










1. 开发WAP软件需要哪些工具? 为了开发WAP应用程序,需要一个WAP网关(注意:这里的网关可能是指支持WML的服务器。可以通过配置WWW服务器达到这个目的)和WAP工具包。工具包应当包括模拟器和能让开发者浏览WML网页。WML页面的开发和HTML页面的开发一样,可以使用Notepad或者其他文本编辑器来进行编辑。 2. 有哪些公司现在提供这样的开发环境? Nokia、Ericsson、UpPhone和Motorola都提供免费的WAP网关和工具包。Nokia:Nokia Toolkit和Nokia WAP Server。Ericsson:Ericsson R320和WapIDE。UpPhone:UpPhone SDK。Motorola:Motorola ADK。 3. 开发WAP应用一定要有WAP手机吗? 不是,当开发WAP应用的时候,不一定需要WAP手机。模拟器可以帮助开发者解决大部分的问题。但是如果是开发商业网站,特别是想知道各种移动电话在显示WML页面上的差别的时候,最好是配备一个。目前各种手机对WML标记的支持和中文的支持状况大不相同,因此WAP手机还是必要的。 4. 开发者需要一个WAP网关吗? 不是很必要。如果只想进行简单的WAP内容服务,可以使用现有的Web服务器(只需要修改MIME类型)。移动电话会通过坐落在本地的网关连接到你的服务器上。但是在网关上驻留开发者的程序有很多好处。既然开发者的程序是网关的一个部分,开发者就可以知道呼叫号码、身份、位置等等。 5. 可以看到WML的源代码么? 如果开发者使用SDK浏览的时候将能够看到WML的代码。如果只有一个HTML浏览器,可以访问“Fetch Page”服务(http://www.webcab.de)来取得代码。这个可以显示在Internet上的任何WML页面中。 6. 可能在WML中加入applets吗? 不能。7. 可以使用HTML开发工具来开发WAP应用吗? 在大多数情况下开发工具是使用基于PC的浏览器。HTML、JavaScript和Java对于WAP开发来说都没有用处。但是,越来越多的开发工具在加入对WML的支持。Allair的Cold Fusion 4.5 和 HomeSite已经有WML支持,虽然Allair也许需要清除一些BUG。另外PHP和ASP在Coldfusion/HomeSite也能支持。可以到 Marjolei Katsma的 HomeSite Help site 上得到更多的信息。 8. 可以通过WML页面来操作数据库吗? 可以,与创建HTML页面相同。任何相关的服务器端的技术都可以用来生成WML页面。 9. 可以使用CGI生成WML页面吗? 当然。可以用创建HTML同样的方法来创建WML。如果想书写一个CGI来创建WML,只要记住在页面的开头正确设置MIME类型。具体的形式根据所使用的语言不同而不同。例如在Perl中: print ("Content-type:application/vnd.wap.wml \n\n\n"); 注意至少要使用2个换行。 10. 如何使用Cold Fusion来生成页面? 使用Cold Fusion只需要加上:
11. 如何使用PHP来书写动态的WML页面? PHP(和大多数其他服务端脚本语言一样)可以被用来书写动态的WML内容。只需要将输出的标记限制在WML微型浏览器可接受的范围内。注意PHP有很多内建的HTML功能,特别是错误功能,这些功能WML微型浏览器可能无法识别。PHP同样可以在一个HTML文件中编写出既适合于HTML,也适合于WML的内容。PHP的源代码对于客户端来说是不可见的。因此可以针对HTML浏览器输出HTML页面,针对WML浏览器输出WML页面。可以在开发PHP编写的WML页面的时候把以下代码加在开头: \n");echo("\n\n");?> 基于PC的浏览器将忽略这些无法理解的WML标记。但是如果想在WAP设备或者模拟器上测试的时候,只需要将"//"去掉,页面自动变成WML页面。 12. 使用PHP动态输出WML 这些例子生成一个非常有用的应用叫做:PizzaCalc。它将输入所有的pizza的帐单和人的数目,可以算出每个人的花费。应用生成一个动态的页面叫做“calc”或者“input”。注意到所有的转义字符例如双引号。该页显示了一个简单的变量处理,和如何传递参数到另外的卡片:使用WML浏览器就可以测试应用程序:http://wap.colorline.no/wap-faq/apps/pizzacalc.html。或者输入:http://wap.colorline.no/demos.html选择应用。 \n");echo("\n\n");echo("\n");echo("\n");?> \n"); echo("\n"); echo("\n"); echo("\n"); echo("\n"); echo("The cost per eater will be ".$total / $eaters."
\n"); } else { echo("\n"); echo("
\n");echo("Split Pizza bill\n"); echo("
\n"); echo("Total cost: \n"); echo("Eaters: \n"); }?>
This deck will never be stored in the cache
下面的页面是在经过86400秒(24 hours)后过期。This card will live in the cache for a day
有些浏览器例如:UP.Simulator如果可以通过“返回”达到另外一个卡片,那么它将不会重新装载卡片。为了强制这个更新动作,用户必须在META标签中使用must-revalidate 参数。 28. 如何防止变量被保存在Cache中? 变量保存在Cache中,这样变量还可以再利用。例如当用户返回到上一个输入卡片,他不需要重新输入,只需要改变需要改变的地方。但是在某些情况下这会造成一些问题。例如以WAP聊天系统,有些变量用了一遍又一遍,但是需要不同的内容。有些浏览器,例如:Nokia 7110,就会存在类似的在该清除的时候无法清除的问题。在WML中,标签有一个参数叫做newcontext。当newcontext="true" 时清除所有的变量。但是这样也清除了所有导航的历史记录,这意味着back按钮不再工作。为了清除变量,可以告诉浏览器将变量设为空: 但是,不是每个时候都有效果。在某些情况下必须使用一个难以想象的方法来清空变量。就是使用 onenterforward 事件。 29. 怎么能够知道请求是从WML浏览器来的还是HTML浏览器来的? 既然要利用已经存在的为HTML浏览器编写的代码,就需要知道请求是从HTML浏览器还是从WML浏览器过来的。同样地,如果想重新引导的HTML浏览器直接到相应的HTML文档上,WML浏览器到WML页面上,以下的PHP代码就可以做到这些。 0){// Check whether the browser/gateway says it accepts WML. $br = "WML"; } else { $browser=substr(trim($HTTP_USER_AGENT),0,4); if($browser=="Noki" || // Nokia phones and emulators $browser=="Eric" || // Ericsson WAP phones and emulators $browser=="WapI" || // Ericsson WapIDE 2.0 $browser=="MC21" || // Ericsson MC218 $browser=="AUR " || // Ericsson R320 $browser=="R380" || // Ericsson R380 $browser=="UP.B" || // UP.Browser $browser=="WinW" || // WinWAP browser $browser=="UPG1" || // UP.SDK 4.0 $browser=="upsi" || // another kind of UP.Browser ?? $browser=="QWAP" || // unknown QWAPPER browser $browser=="Jigs" || // unknown JigSaw browser $browser=="Java" || // unknown Java based browser $browser=="Alca" || // unknown Alcatel-BE3 browser (UP based?) $browser=="MITS" || // unknown Mitsubishi browser $browser=="MOT-" || // unknown browser (UP based?) $browser=="My S" || // unknown Ericsson devkit browser ?$browser=="WAPJ" || // Virtual WAPJAG www.wapjag.de$browser=="fetc" || // fetchpage.cgi Perl script from www.wapcab.de$browser=="ALAV" || // yet another unknown UP based browser ? $browser=="Wapa") // another unknown browser (Web based "Wapalyzer"?) { $br = "WML"; } else { $br = "HTML"; } } if($br == "WML") {// Force the browser to load the WML file instead header("302 Moved Temporarily"); header("Location: ".$wmlredirect); exit; } else {// Force the browser to load the HTML file instead header("302 Moved Temporarily"); header("Location: ".$htmlredirect); exit; } ?> 这个判断是在服务端完成的, PHP代码将首先查看网关是否接收text/vnd.wap.vml MIME类型。如果不是,将检测前面的字符,查看是否为WML浏览器。如果不符合,那么就假设为HTML浏览器。如果有新的WML浏览器,那么ID字符串也要增加。这个代码基于Robert Whitinger(robert@wapsight.com)的代码,使用了Don Amaro(donamaro.concepcion@nl.unisys.com)提供的列表。注意:由于只需要四个字符串就可以辨别,因此例如:"WapIDE-SDK/2.0;(R320s(Arial))" 可以使用“WapI”来代替是可行的做法,也是足够的。同样的功能也可以通过ASP来解决。先判断请求的是“/index.wml” 或者 “/index.html” 和所需要的MIME类型。另外以下的脚本辨别的方式和上面不一样。另外还需要网关告诉服务器它能接收 的text/vnd.wap.wml MIME类型。该例子如下所示: <%Response.Buffer = TRUE Dim IsWap httpAccept = LCase(Request.ServerVariables("HTTP_ACCEPT")) if Instr(httpAccept,"wap") then IsWap=1 Else Response.Redirect "/index.html" : Response.Flush : Response.EndEnd if%><%Response.ContentType = "text/vnd.wap.wml"%><%Response.Flush%> <%Response.Flush:Response.End%> 30. 如何判断访问者是来自哪个浏览器或者移动电话? 可以通过检查HTTP_USER_AGENT标签来判断。例如试着使用Microsoft Internet Explorer访问一个站点的时候,HTTP_USER_AGENT将返回:Mozilla/4.0 (compatible;MSIE 5.0; Windows 98);在同样的情况下使用Nokia 7110访问这个站点,HTTP_USER_AGENT就会是:Nokia7110/1.0(04.73)。据此可以判断用户代理是什么类型的。 31. 可以得到用户代理的电话号码吗? 不可以,除非网关支持这个特点,WAP没有办法知道用户的电话号码。 32. 可以通过WML使得可以用WAP设备进行拨号吗? WAP的电话功能可以使用Wireless Telephony Application Interface(WTAI)。 例如: WMLScript: WTAPublic.MakeCall("9287787"); 但是第一代的WAP设备不支持这个功能。 33. 能够从WAP设备中读取数据吗,例如:电话号码? 这里有一些通过HTTP的信息,但是十分有限。既然只有网关发送过来少量的信息,像WAP设备的号码可能无法读取。同时,在某些国家这还涉及到个人隐私的问题。基本上丢弃的内容就是WAP网关传送给HTTP服务器的内容。这不同于WAP网关到网关。Phone.com的UP.Link网关是一个最好的例子。因为它在HTTP头中返回一个字符串叫做 UP_X_SUBNO,里面包含了电话号码。Ericsson网关将传送一个辨别设备用的字符串,但是在明文中没有电话号码。每次WAP设备向HTTP服务器请求一个URL,WAP网关就会将信息传送给HTTP服务器。以下的PHP脚本显示了从网关过来的所有HTTP头的信息。可以使用WML浏览器进行测试。(http://wap.colorline.no/clientinfo.html)。其他的例子也可以在下面的UTL中找到:http://wap.colorline.no/demos.html第一个部分是取得所有的标准HTTP头信息。第二个部分是提取一个内容。 \n");echo("\n\n"); echo(" \n"; } // Second part
// IP address of the client side echo("REMOTE_ADDR: ".$REMOTE_ADDR. "
\n");// Port at the client side echo("REMOTE_PORT: ".$REMOTE_PORT. "
\n");// Name of authenticated user echo("REMOTE_USER: ".$REMOTE_USER. "
\n");// Gateway Interface type echo("GATEWAY_INTERFACE: ".$GATEWAY_INTERFACE. "
\n");// Protocol used by the server echo("SERVER_PROTOCOL: ".$SERVER_PROTOCOL. "
\n");// Request Method echo("REQUEST_METHOD: ".$REQUEST_METHOD. "
\n");// Connection type echo("HTTP_CONNECTION: ".$HTTP_CONNECTION. "
\n");// Host it connected via (proxy) echo("HTTP_VIA: ".$HTTP_VIA. "
\n"); ?>
Send it
下面仍然是一个使用GET的请求,但是使用了来传送参数。这个代码就漂亮多了。既然可以定义为GET,同样也很容易转成POST。Send it
直接改为POST:Send it
最好是做测试找到到底能传输多少数据。这里有个测试程序: http://wap.colorline.no/wap-faq/apps/putsize.php3。 这个程序也可以在下面的URL中找到:http://wap.colorline.no/demos.html。该程序将产生一个卡片包含一个变量,里面包含了一定数量的字符X。用户可以选择传输是使用GET还是POST。在传输之后,脚本将要显示接收到的字符个数。脚本生成一个页面来测试使用GET或者POST方式到底能发送多少个字符:GET data
36. 如何同HTML站点一样POST/CGI,返回表单数据到服务器? 如果使用: 并且使用: 就可以POST数据给CGI程序了。 37. POST无法工作是怎么回事? 有很多说POST参数将会丢失的流言,特别是在Nokia 7110。就笔者所知,还没有哪个Nokia 7110有这样的问题。这个问题主要是存在于网关或接收方。测试显示Nokia SDK 2.18,当使用内建网关的时候,使用POST会出现问题。甚至当method 设置成“POST”的时候,服务器那边还是将POST请求作为 GET。当使用POST的URL时 ,Nokia SDK 将会崩溃。在某些情况下URL的最后的字符将被删除。POST Test页面将简单的POST的两个变量叫做“var1”和“var2”来显示整个变量的内容和HTTP头的内容。如果不能看到正确的变量内容,肯定有问题。检查HTTP头中的application/x-www-form-urlencoded(注意!需要在变量中输入一些内容)。这个方法解决了Nokia SDK 2.18的问题,可以把它配置到任意的公共网关来测试。笔者推荐使用 wapHQ 网关。在其他的情况下,POST确实不工作,问题可能是HTTP头在服务器端解释的时候有问题。脚本语言,例如:ASP、Java或是CGI等等都是通过查看在HTTP头中的 application/x-www-form-urlencoded 完全匹配的字符串。在某些情况下字符串可能有附加的数据,例如:charset="utf8" 。既然服务器端不是精确的匹配,它就不会查看HTTP头,因此POST就变量丢失了。 注意这不是浏览器的问题,在HTTP头加入字符集描述,将造成脚本语言方面的错误。为了检测有关网关或浏览器的问题,仍使用上面的POST Test页面来测试。同样查看application/x-www-form-urlencoded 的输出,检查有没有附加的字符在结尾部分,如果有,那么这就是服务器端的问题。解决这个问题的方案很复杂,它随用户使用的脚本描述语言不同而不同,而且需要操作原代码。简单地说,解决方案就是需要人工读取HTTP头,不要使用脚本语言已经写好的读取方式。这里有一个用ASP编写的解决方法。它显示了如何在POST中抓取数据。用户需要从二进制数据中发现需要的变量。 Dim lngToalByteCountDim vntRequestData lngTotalByteCount = Request.TotalBytes vntRequestData = Request.BinaryRead(lngTotalByteCount) 全部的代码,就应该像下面的代码: <%@ Language=VBScript %><% Dim Temp, i, sPost, sWMLDeck 'Converts the binary data to a string. For i = 1 To Request.TotalBytes Temp = Request.BinaryRead(1) sPost = sPost & Chr(AscB(Temp)) Next 'Parses out the values of the POSTED variables (in this 'example myvar1 and myvar2). Dim sVar1, sVar2 sVar1 = getVar("myvar1", sPost) sVar2 = getVar("myvar2", sPost) 'Writes the WML Deck displaying the POSTED Variables sWMLDeck = "" & vbCrLf sWMLDeck = sWMLDeck & "" & vbCrLf sWMLDeck = sWMLDeck & vbCrLf & "" & vbCrLf & vbTab sWMLDeck = sWMLDeck & "" & vbCrLf sWMLDeck = sWMLDeck & vbTab & vbTab & "" & vbCrLf sWMLDeck = sWMLDeck & vbTab & vbTab & vbTab & "myVar1: " & sVar1 & "
" & vbCrLf sWMLDeck = sWMLDeck & vbTab & vbTab & vbTab & "myVar2: " & sVar2 & vbCrLf sWMLDeck = sWMLDeck & vbTab & vbTab & "
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。