34. 有没有办法连接到电话号码? 在某些情况下,当在显示了一连串的号码之后,需要中断功能连接到一个电话号码上并拨号。例如:执行一个 dial:12345678 就非常像 mailt 标签。 越来越多的浏览器都支持这个功能,但还不是所有。Phone.com, Mitsubishi 和 Ericsson 已经在浏览器中集成了这个基于Wireless Telephony Interface specifications (WTAI)的功能。 WTAI将允许以下的URL将关闭连接并且拨号: <go href="wtai://wp/mc;+4712345678">Make a call to +47-12345678</go> 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的例子。 <input type="text" name="var1" format="*N"/> <p> <anchor>Send it <go href="somescript.cgi?variable=$(var1)" method="get"/> </anchor> </p> 下面仍然是一个使用GET的请求,但是使用了<postfield>来传送参数。这个代码就漂亮多了。既然可以定义为GET,同样也很容易转成POST。 <input type="text" name="var1" format="*N"/> <p> <anchor>Send it <go href="somescript.cgi" method="get"> <postfield name="variable" value="$(var1)"/> </go> </anchor> </p> 直接改为POST: <input type="text" name="var1" format="*N"/> <p> <anchor>Send it <go href="somescript.cgi" method="post"> <postfield name="variable" value="$(var1)"/> </go> </anchor> </p> 最好是做测试找到到底能传输多少数据。这里有个测试程序: http://wap.colorline.no/wap-faq/apps/putsize.php3。 这个程序也可以在下面的URL中找到:http://wap.colorline.no/demos.html。 该程序将产生一个卡片包含一个变量,里面包含了一定数量的字符X。用户可以选择传输是使用GET还是POST。在传输之后,脚本将要显示接收到的字符个数。 脚本生成一个页面来测试使用GET或者POST方式到底能发送多少个字符: <?xml version="1.0"?> <!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml"> <wml> <head> <meta forua="true" http-equiv="Cache-Control" content="max-age=0"/> <meta forua="true" http-equiv="Cache-Control" content="must-revalidate"/> </head> <card> <do type="prev" label="Back"> <go href="putsize.php3"/> </do> <p> <anchor>GET data <go method="get" href="putsize.php3"> <postfield name=\"a\" value="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"/> </go> </anchor> </p> </card> </wml> 36. 如何同HTML站点一样POST/CGI,返回表单数据到服务器? 如果使用: <go method="post" href="mycgi.cgi"> 并且使用: <postfield name="fieldname" value="$NameOfInputField"/> 就可以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 lngToalByteCount Dim 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). |