全国统一咨询热线:18609840880

WAP网站建设开发经验总结之六

2016-04-12 11:20:23

  49. 什么是PUSHing,它是如何工作的?

  PUSH被加入到WAP 1.2,而且只在WAP 1.2中才存在。简单地来说,PUSH提供了另外一种从服务器向用户发送数据的方式。PULLing是从客户端请求信息,然后接收它;PUSH意味着服务器可以

  向用户发送数据,而不需要用户来请求。

  内容或者应用服务器无法向用户代理直接发送数据,必须使用一种叫做Push Proxy 的网关。PPG 是基于Internet的Push Initiator (内容或者应用服务器) 与移动用户之间的。在

  Internet一边,使用Push Access Protocol,在移动网络一边使用Push Over-the-Air Protocol。

  当前只有 WAP 1.2 开发平台支持 PUSH, 例如 Nokia Toolkit 2.0。 Nokia Toolkit 2.0 only 内部支持PUSHing,意味着用户可以从工具包的界面将消

  息推送到模拟器。如果想试着到一个外部的Push Proxy Gateway, 工具包就崩溃了。从readme文件中知道,PUSHing 还没有经过完整的测试。

  50. WAP模拟器说text/html不支持,但是用户的MIME设置是正确的,为什么?

  当使用服务端的脚本语言,例如ASP、PHP或者Perl,来生成WML输出,或者从HTTP服务器提供WML页面的时候。记住HTTP一般默认的显示是HTML,其MIME类型是text/html。

  如果HTTP服务器或者服务器脚本有错误,错误的信息将使用HTML显示,因此微型浏览器是不能显示错误信息的。

  一个开发工具/模拟器可以让用户看到从HTTP服务器过来的代码。例如,在Nokia SDK中,这个功能被称做View Source。通过看代码可以知道HTTP服务器到底发送了些什么内容。也可以使用普通

  的浏览器来查看任何HTML格式的错误信息。

  51. 在哪儿有Visio移动电话的模板库?

  目前唯一知道的就是它包含在 Nokia 7110 中。

  52. 有没有其他有用的WML内容服务列表?

  这里至少有一个。

  对于Unix用户, http://pwot.co.uk/wml/中有Thomas Neill (ponder@pwot.co.uk)提供的WML工具,包括WML二进制编译和反编译。

  Angus 和 Zygo WAP(angus@z-y-g-o.com)已经开发出了一个Perl工具包。它还在为管道式的WML编译器工作。

  53. XML到XSL的转换可以应用到WML和WAP吗?

  既然WML实际上是XML,并且XSL将WML转换成其他不同的XML文档,那么问题的答案是显然的:XSL也可以应用到WML。可以参考Luca Passani的文章《WebTechniques》。这个文

  章在网络上的地址是:

  http://www.webtechniques.com/archives/2000/03/passani/

  它推荐看一下叫做《在 Apache下Cocoon计划的实现》这篇文章。“Cocoon 是一个依赖于新的W3C技术(例如DOM,XML,和XSL)框架。Cocoon计划在于改变Wen信息创建,生成和提

  供的方式。文档内容、风格和逻辑经常因为个人或者工作组的不同而不同。 Cocoon目标在于将这三层分离,允许三层次之间进行独立的设计,创建和管理,减少相互之间的影响,增加工作的可复用性以及缩短上市的时间

  。Web内容的产生大多数是基于HTML的,但是HTML并不能将三者分离开来,混合着各种格式标签,程序逻辑等等。而Cocoon计划将要改变这种情况,允许内容,逻辑和风格相互分离。使用XML来保存,但是使

  用XSL来将它们混合。”

  基本上来说,Cocoon将解读HTTP头,判断使用的是什么浏览器,然后使用不同的风格来选择正确的页面,使用XSL进行混合。

  54. 想让用户只要简单地按下一个按钮就能够转跳到其他卡片而不是通过选择URL,这个可能吗?

  不,不可能。

  55. 如何避免一个行的中断以便可以在一行中输入多个链接?

  在Nokia 7110中,不可能做到这一点,每个链接都占据自己的一行。

  1:42 | 添加评论 | 固定链接 | 引用通告 (0) | 记录它 | WAP开发

  WAP开发(二)

  27. 怎样防止从Cache中读取WML页面?

  当WML页面下载到WAP设备后,它将保存在WAP设备内存中一段时间,直到这个时间过期。在这之后,页面将从服务器下载,而不是从WAP设备的缓存读取。这个过程被称做Cache。

  但是有些时候不想让页面从缓存中读取,而是从服务器端读取。一个典型的例子就是当服务器的内容不断在更新的时候,通过在HTTP头中加入一定的cache信息,来告诉WAP设备该页面将不存储在缓存中。

  可以在服务器端生成HTTP头,或者使用PHP、ASP、Perl或者其他服务端开发语言。这一行不能被包括在页面里,既然是HTTP的信息头,就不是WML元素。

  对于静态页面,或许没有使用服务器端脚本语言,许多浏览器支持META标签来控制浏览器的Cache。看本部分的后的例子。

  将下面代码加入到HTTP头中,页面将马上过期:

  Expires: Mon, 26 Jul 1997 05:00:00 GMT

  Last-Modified: DD. month YYYY HH:MM:SS GMT

  Cache-Control: no-cache, must-revalidate

  Pragma: no-cache

  先进行告诉微型浏览器,页面已经过期一段时间了。第二行告诉浏览器页面后一次修改的时间。DD应该换成当天的日期,month YY HH MM SS等等类推。第三行和第四行有同样的效果。告诉浏览器页面不被

  Cache(第三行适用于 HTTP 1.1,第四行适用于HTTP 1.0)。

  下面的是PHP的一个例子:

  // set the correct MIME type

  header("Content-type: text/vnd.wap.wml");

  // expires in the past

  header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");

  // Last modified, right now

  header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");

  // Prevent caching, HTTP/1.1

  header("Cache-Control: no-cache, must-revalidate");

  // Prevent caching, HTTP/1.0

  header("Pragma: no-cache");

  ?>

  下面是使用WebClasses(VB)的例子。使用"Response.Expires=-1",防止Cache。

  Private Sub WebClass_Start()

  'Set correct MIME type

  Response.ContentType = "text/vnd.wap.wml"

  'Make sure no caching

  Response.Expires = -1

  Response.AddHeader "Pragma", "no-cache"

  Response.AddHeader "Cache-Control", "no-cache, must-revalidate"

  'Use basicwml(my own) as template

  Set NextItem = basicwml

  End Sub

  这里有一个ASP的例子,同样使用“Response.Expires=-1”防止Cache。

  <%

  Response.ContentType = "text/vnd.wap.wml"

  Response.Expires = -1

  Response.AddHeader "Pragma", "no-cache"

  Response.AddHeader "Cache-Control", "no-cache, must-revalidate"

  %>

  后是使用META的例子:

  "http://www.wapforum.org/DTD/wml_1.1.xml">

  This deck will never be stored in the cache

  下面的页面是在经过86400秒(24 hours)后过期。

  "http://www.wapforum.org/DTD/wml_1.1.xml">

  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代码就可以做到这些。

  // Because this script sends out HTTP header information,

  // the first characters in the file must be the

  // relative URL to your HTML file

  $htmlredirect = "/html/my_htmlpage.html";

  // ABSOLUTE URL to your WML file

  $wmlredirect = "http://wap.mysite.com/wml/my_wmldeck.wml";

  if(strpos(strtoupper($HTTP_ACCEPT),"VND.WAP.WML") > 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.End

  End if

  %>

  <%Response.ContentType = "text/vnd.wap.wml"%>

  <%Response.Flush%>

  "http://www.wapforum.org/DTD/wml_1.1.xml">

  enter

  <%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_SUBN

  O,里面包含了电话号码。Ericsson网关将传送一个辨别设备用的字符串,但是在明文中没有电话号码。

  每次WAP设备向HTTP服务器请求一个URL,WAP网关就会将信息传送给HTTP服务器。

  以下的PHP脚本显示了从网关过来的所有HTTP头的信息。可以使用WML浏览器进行测试。(http://wap.colorline.no/clientinfo.html)。其他的例子也可以在下面的UT

  L中找到:http://wap.colorline.no/demos.html

  先进个部分是取得所有的标准HTTP头信息。第二个部分是提取一个内容。

  header("Content-type: text/vnd.wap.wml");

  echo("/n");

  echo("

  /"http://www.wapforum.org/DTD/wml_1.1.xml/">/n/n");

  echo("

  ?>

  // First part – standard HTTP stuff

  $headers = getallheaders();

  while (list($header, $value) = each($headers)) {

  echo strtoupper($header). ": ". $value. "

  /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");

  ?>

  Henrik Gemal (gemal@dk.net)也有一个在线的基于WML的工具BrowserSpy,来显示更多关于HTTP头的信息、服务器环境和用户的浏览器等等。有关这个工具的详细情况可以浏览h

  ttp://wap.gemal.dk/

  Werner Forkel 提交了一个Perl的脚本,可以显示电话号码(如果有)。可以在以下位置测试:http://wap.colorline.no/wap-faq/apps/subnotest.w

  ml,同样也收集在:http://wap.colorline.no/demos.html.

  这些程序只适合某个网关。如果要测试其他的网关,可能就显示不出电话号码。因此电话号码不能作为ID号来处理。至少因为不是一个全球的标准。 34. 有没有办法连接到电话号码?

  在某些情况下,当在显示了一连串的号码之后,需要中断功能连接到一个电话号码上并拨号。例如:执行一个 dial:12345678 就非常像 mailto: 标签。

  越来越多的浏览器都支持这个功能,但还不是所有。Phone.com, Mitsubishi 和 Ericsson 已经在浏览器中集成了这个基于Wireless Telephony Interface

  specifications (WTAI)的功能。 WTAI将允许以下的URL将关闭连接并且拨号:

  Make a call to +47-12345678

  Nokia 7110 已经有个功能叫做“Use Number”。它可以通过WML卡片查找一个类似于电话号码的列表,然后用户可以选择进行呼叫。注意用户必须分离这些数字以便它能正常工作。

  35. 使用GET或者POST方式能传送多少字符?

  使用GET或者POST方式所能传送的字符数目,不同的设备有不同的限制。一个GET通过UTL传送变量,能传送的数据总量比使用POST方式所能传送的数据要小。例如,Nokia 7110似乎对每个GET

  限制在512个字节左右,但是POST大可以达到一个编译后卡片的大小(约1300字节)。UP.SDK 4.0将GET请求限制在970左右,大可以达到一个编译后卡片的大小。

  显然,卡片有时候保存了要发送给服务器的参数的内容,既然编译后的卡片大小有限制,那么肯定要影响到整个所能传输的数据。

  在POST和GET之间没有太多的区别。比如这个没有很好地使用GET的例子。

  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方式到底能发送多少个字符:

  "http://www.wapforum.org/DTD/wml_1.1.xml">

  GET data

  value="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"/>

  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-f

  orm-urlencoded 完全匹配的字符串。在某些情况下字符串可能有附加的数据,例如:charset="utf8" 。既然服务器端不是精确的匹配,它就不会查看HTTP头,因此POST就变量丢失了。