wap開發faq

  • 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只需要加上:

        <CFCONTENT type="text/vnd.wap.wml">

  • 11. 如何使用PHP來書寫動態的WML頁面?

        PHP(和大多數其他服務端腳本語言一樣)可以被用來書寫動態的WML內容。只需要將輸出的標記限制在WML微型瀏覽器可接受的範圍內。
        注意PHP有很多內建的HTML功能,特別是錯誤功能,這些功能WML微型瀏覽器可能無法識別。
        PHP同樣可以在一個HTML文件中編寫出既適合於HTML,也適合於WML的內容。PHP的源代碼對於客戶端來說是不可見的。因此可以針對HTML瀏覽器輸出HTML頁面,針對WML瀏覽器輸出WML頁面。
        可以在開發PHP編寫的WML頁面的時候把以下代碼加在開頭:

    <?

    // header("Content-type: text/vnd.wap.wml");
      echo("<?xml version=/"1.0/"?>/n");
    echo("<!DOCTYPE wml PUBLIC /"-//WAPFORUM//DTD WML 1.1//EN/"
    //"http://www.wapforum.org/DTD/wml_1.1.xml/">/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選擇應用。

    <?
    header("Content-type: text/vnd.wap.wml");
    echo("<?xml version=/"1.0/"?>/n");
    echo("<!DOCTYPE wml PUBLIC /"-//WAPFORUM//DTD WML 1.1//EN/"
    /"http://www.wapforum.org/DTD/wml_1.1.xml/">/n/n");
    echo("<!--The application PizzaCalc was originally made by The Crusaders
    www.crusaders.no on the Commodore Amiga -->/n");
    echo("<!-- It was unfortunately not possible to emulate the crap interger handling of the
    original program -->/n");
    ?>

    <wml>
    <?
      if($action == "calc") {
        echo("<card id=/"result/" title=/"PizzaCalc/">/n");
        echo("<do type=/"prev/" label=/"Back/">/n");
        echo("<go href=/"pizzacalc.html#input/"/>/n");
        echo("</do>/n");
        echo("<p>/n");
        echo("The cost per eater will be ".$total / $eaters."<br/>/n");
      }
      else {
        echo("<card id=/"input/" title=/"PizzaCalc/">/n");
        echo("<p>/n");
    echo("<anchor>Split Pizza bill
    <go href=/"pizzacalc.html?total=/$(total)&eaters=/$(eaters)&action=calc/"/>
    </anchor>/n");
        echo("<br/>/n");
        echo("Total cost: <input type=/"text/" name=/"total/" format=/"*N/"/>/n");
        echo("Eaters: <input type=/"text/" name=/"eaters/" format=/"*N/"/>/n");
      }
    ?>
    </p>
    </card>
    </wml>

  • 13. 可以使用Java Servlet來生成WML頁面嗎?

        當然。可以使用創建HTML同樣的方法來創建WML。如果想書寫一個CGI來創建WML,只要記住在頁面的開頭正確設置MIME類型:
        response.setContentType("text/vnd.wap.wml");

  • 14. 可以使用ASP、Perl等生成動態的應用嗎?

        是的。可以使用任何服務器端的腳本語言來生成WAP應用。

  • 15. 如何使用ASP書寫WML內容?

        ASP(Active Server Pages)可以做到和PHP一樣,也可以用來書寫動態的WML。如果需要一些好的例子請參考Luca Passani's WAP and ASP articles。或者查看Jean-Luc Praz's ([email protected])。更多的ASP例子在:http://www.corobori.com/wap/。

  • 16. 在使用ASP動態輸出WML頁面的時候,已經設置了Content-type,但是瀏覽器返回的仍然是text/html,有什麼問題嗎?

        如果在ASP腳本中有一個錯誤,那麼診斷程序會發還一個HTML頁面,請檢查腳本。

  • 17. 在使用ASP生成WML頁面的時候出現了錯誤: <MIME type "text/html" is not supported>,會是什麼問題?

        這個問題是Web瀏覽器不知道WML的正確類型,修改ASP的第一行,加入:

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

        後就可以工作了。

  • 18. 下面的代碼有什麼問題嗎?

    <%Response.ContentType = "text/vnd.WAP.WML"%>
    <?xml version="1.0"?>

        去掉<?xml version="1.0"?>之前的空格。XML解釋器希望在這行中沒有其他字符,甚至是空行。

  • 19. ASP代碼可以在模擬器上工作,在真正的瀏覽器上怎麼不行?

        在很多模擬器上沒有像真正的WML瀏覽器那麼嚴格。這些對於那些沒有使用網關的模擬器(Nokia SDK/Toolkit)來說更是這樣,有些就根本沒有使用網關(WinWAP、WapMAN)。
        一個真正的WML瀏覽器應該只讀取二進制的數據(從WML編碼得來的)WMLC,對於網關應該將文本WML轉換/編譯成WMLC。語法是非常嚴格的。ASP是爲HTML瀏覽器設置的,但是HTML沒有WML那麼嚴格。
        這裏在ASP生成動態頁面的時候有一個微小的“bug”。它在WML瀏覽器上不允許有任何地方輸出白行(例如:空格,回車,換行)。注意到有些網關可能會修正這些問題,但有的則不管(例如:CMG網關)。
        下面是一個常見的ASP代碼用來輸出WML頁面開頭的MIME類型:

    <%Response.ContentType = "text/vnd.wap.wml"%>
    <?xml version="1.0"?>

        問題就在ASP將會在 .wml"%> 和 <?xml vers 之間輸出換行和回車。這兩行就被分割了。這將打亂WML代碼的內容。WML必須以“<”開頭,而且第一行是<?xml version="1.0"?>。就上面的WML頁面回車/換行將會出現問題。
        最簡單的解決辦法是:

        <%Response.ContentType = "text/vnd.wap.wml"%><?xml version="1.0"?>

        在XML定義正確的格式化以後,後面的部分WML對空格就沒有那麼嚴格的要求。

        要注意的是有些網關在輸出ASP的時候會有問題,因此在WML代碼中最好使用 Response.Write 而不是<%=MyVar%>。

  • 20. 如何使用Perl來生成WML內容?

        和其他Server端程序一樣。Perl也可以用來書寫漂亮的WAP應用程序。
        最常見的就是如何使用Perl輸出正確的MIME類型,下面的例子說明了這一點:

    print "Content-type: text/vnd.wap.wml/n/n";
    print "<?xml version=/"1.0/"?>/n";
    print "<!DOCTYPE wml PUBLIC /"-//WAPFORUM//DTD WML 1.1//EN/"
    /"http://www.wapforum.org/DTD/wml_1.1.xml/">/n";
    print "<wml>/n";
    ……

  • 21. 應當如何下手書寫WAP應用程序?

        其實需要的只是Text編輯器。但是使用一個開發工具可以節約很多時間。
        在這之前應該瀏覽一下WAP的權威站點:www.wapforum.com。
        在Nokia WAP 開發論壇中進行註冊,並且下載Nokia WAP Developer Toolkit 。Toolkit中的PDF文件可以給出一定的WML和WMLScript指導。Nokia Toolkit需要JRE (Java Runtime Environment) v.1.2.2 或者更高版本。
        雖然工具可以用來爲WAP設備設計應用,但是不是爲專門的移動電話。在WAP開發工具上所看到的並不代表用戶在手機上所看到的。爲了確定想看到的事情,最好需要一個WAP設備,例如移動電話,或者模擬器。
        Nokia WAP SDK 2有一個7110的模擬器。模擬器是一個有效的檢測方式,能檢測程序中的bug。 Nokia SDK 同樣還包括一個小的WAP server讓開發者可以從本地或者HTTP服務器上下載WML頁面。
        到 Phone.com 開發站點註冊後,Phone.com 提供UP.browser。這是最流行的瀏覽器,特別是在美國,Phone.com 提供UP.SDK。 在註冊之後就可以下載。
        對於Ericsson R320 和 R380是最近的事情。應該註冊並查看Ericsson's Developer's Zone 來得到開發工具。R380是一個非常好的模擬器,在 Symbian 不需要註冊就可以下載。Ericsson 沒有公開的爲R320的模擬器。
        Motorola 有一個平臺叫做 Mobile Internet eXchange 或者 MIX 。Mobile Application Development Kit 已經開發出一個開發平臺,即爲WAP也爲Motorola的 VoxML。在註冊後,可以在下面的網址找到數據包。

        http://www.motorola.com/MIMS/MSPG/cgi-bin/spn_madk.cgi. 

        WAPmine 是一個獨立的應用,叫做 WAPPage 是一個所見即所得的編輯工具。而且有一個XML樹型控件來編輯WML標籤。
        如果在開發公共應用程序時,想在很多設備上測試你的程序,就像在不同的瀏覽器上測試HTML頁面一樣。注意在不同的WML瀏覽器上的差別,可能比在不同的HTML瀏覽器上的差別要大。

  • 22. 如何編寫和測試WML頁面?

        現在有很多SDK。AnywhereYouGo.com有WAP SDK和IDE列表,可以下載一個來用。任何文本編輯器都可以書寫一個簡單的WML頁面,當然HTML編輯器也可以(特別是那些支持個人定義標籤的),例如:Allaire Homesite (http://www.allaire.com )。可以使用SDK來做簡單的測試,但是對於大的項目可能要困難些。AnywhereYouGo.com已經建立一套基於Web的工具來幫助WAP測試。

  • 23. 哪兒可以在找到WML的測試工具?

        首先確定WML代碼是正確的,然後再使用WML測試工具。
        有一個非常好的測試工具在Zygo Communications(http://wap.z-y-g-o.com/tools/),測試工具是用Perl寫的。裏面還有其他的工具可供下載。

  • 24. 如何操作WML頁面?

        操作WML頁面或者卡片,最簡單的辦法是通過現有的網關。大多數移動電話提供者將功能都放在主頁上,在上面可以通過WAP設備操作。網關的鏈接一般叫做“Go to URL”。當選擇以後,WAP設備將通過網關操作指定的普通IP或者URL。在這種情況下,網關讀取從WAP設備發送給網關的WML內容,就像PC瀏覽器讀取內容的過程一樣。
        有些營運商選擇不讓他們的用戶操作其他的站點。這個就像Internet Service Provider只允許用戶操作ISP自己的站點。像這樣的做法是不明智的,這樣會發現自己的用戶去其他地方了。
        如果要堅持這種方法,可以通過ISP撥號或者使用一個公共的網關來取得其他的WAP資源。

  • 25. 有沒有一個友好的方式來管理WML內容?

        還沒有。雖然Oracale正在開發數據庫驅動的文檔服務,被稱爲Panama,可以支持WAP分發。

  • 26. 如何防止用戶代理cache頁面?

        如果用戶使用ASP,應該加入一行<%Response.expires=-1%> ,這個將阻止Cache。

  • 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的例子:

    <?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"/>
        </head>
        <card id="alwaysexpire">
          <p>This deck will never be stored in the cache</p>
        </card>
      </wml>

        下面的頁面是在經過86400秒(24 hours)後過期。

    <?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=86400"/>
        </head>
        <card id="expire1day">
          <p>This card will live in the cache for a day</p>
        </card>
      </wml>

        有些瀏覽器例如:UP.Simulator如果可以通過“返回”達到另外一個卡片,那麼它將不會重新裝載卡片。爲了強制這個更新動作,用戶必須在META標籤中使用must-revalidate 參數。

        <meta forua="true" http-equiv="Cache-Control" content="must-revalidate"/>

  • 28. 如何防止變量被保存在Cache中?

        變量保存在Cache中,這樣變量還可以再利用。例如當用戶返回到上一個輸入卡片,他不需要重新輸入,只需要改變需要改變的地方。但是在某些情況下這會造成一些問題。例如以WAP聊天系統,有些變量用了一遍又一遍,但是需要不同的內容。有些瀏覽器,例如:Nokia 7110,就會存在類似的在該清除的時候無法清除的問題。
        在WML中,<card>標籤有一個參數叫做newcontext。
        當newcontext="true" 時清除所有的變量。但是這樣也清除了所有導航的歷史記錄,這意味着back按鈕不再工作。
        爲了清除變量,可以告訴瀏覽器將變量設爲空:

    <setvar name="one_variable" value=""/>
    <setvar name="another_variable" value=""/>

        但是,不是每個時候都有效果。在某些情況下必須使用一個難以想象的方法來清空變量。就是使用 onenterforward 事件。

    <onevent type="onenterforward">
       <refresh>
         <setvar name="one_variable" value=""/>
         <setvar name="another_variable" value=""/>
       </refresh>
    </onevent>

  • 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 <? PHP tag.

    // 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([email protected])的代碼,使用了Don Amaro([email protected])提供的列表。
        注意:由於只需要四個字符串就可以辨別,因此例如:"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"%><?xml version="1.0"?>
    <%Response.Flush%>
    <!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN"
    "http://www.wapforum.org/DTD/wml_1.1.xml">
      <wml>
      <card id="redirect">
      <onevent type="onenterforward">
      <go href="/index.wml"/>
      </onevent>
      <p>
      <a href="/index.wml">enter</a>
      </p>
      </card>
      </wml>
      <%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頭信息。第二個部分是提取一個內容。

    <?
      header("Content-type: text/vnd.wap.wml");
      echo("<?xml version=/"1.0/"?>/n");
    echo("<!DOCTYPE wml PUBLIC /"-//WAPFORUM//DTD WML 1.1//EN/"
    /"http://www.wapforum.org/DTD/wml_1.1.xml/">/n/n");
      echo("<!—Code written in Microsoft NOTEPAD.EXE à /n");
    ?>

    <wml>
      <card id="init" title="Client Info">
        <p>
          <?
            // First part – standard HTTP stuff
            $headers = getallheaders();
            while (list($header, $value) = each($headers)) {
              echo strtoupper($header). ": ". $value. "<br/>/n";       
            }
            // Second part

    // IP address of the client side
            echo("REMOTE_ADDR: ".$REMOTE_ADDR. "<br/>/n");
    // Port at the client side
            echo("REMOTE_PORT: ".$REMOTE_PORT. "<br/>/n");
    // Name of authenticated user
            echo("REMOTE_USER: ".$REMOTE_USER. "<br/>/n");
    // Gateway Interface type
            echo("GATEWAY_INTERFACE: ".$GATEWAY_INTERFACE. "<br/>/n");
    // Protocol used by the server
            echo("SERVER_PROTOCOL: ".$SERVER_PROTOCOL. "<br/>/n");
    // Request Method
            echo("REQUEST_METHOD: ".$REQUEST_METHOD. "<br/>/n");
    // Connection type
            echo("HTTP_CONNECTION: ".$HTTP_CONNECTION. "<br/>/n");
    // Host it connected via (proxy)
            echo("HTTP_VIA: ".$HTTP_VIA. "<br/>/n");
          ?>
        </p>
      </card>
    </wml> 

        Henrik Gemal ([email protected])也有一個在線的基於WML的工具BrowserSpy,來顯示更多關於HTTP頭的信息、服務器環境和用戶的瀏覽器等等。有關這個工具的詳細情況可以瀏覽http://wap.gemal.dk/
        Werner Forkel 提交了一個Perl的腳本,可以顯示電話號碼(如果有)。可以在以下位置測試:http://wap.colorline.no/wap-faq/apps/subnotest.wml,同樣也收集在:http://wap.colorline.no/demos.html.
        這些程序只適合某個網關。如果要測試其他的網關,可能就顯示不出電話號碼。因此電話號碼不能作爲ID號來處理。至少因爲不是一個全球的標準。

  • 34. 有沒有辦法連接到電話號碼?

        在某些情況下,當在顯示了一連串的號碼之後,需要中斷功能連接到一個電話號碼上並撥號。例如:執行一個 dial:12345678 就非常像 mailto: 標籤。
        越來越多的瀏覽器都支持這個功能,但還不是所有。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).
      Dim sVar1, sVar2
      sVar1 = getVar("myvar1", sPost)
      sVar2 = getVar("myvar2", sPost)

      'Writes the WML Deck displaying the POSTED Variables
      sWMLDeck = "<?xml version=""1.0""?>" & vbCrLf
      sWMLDeck = sWMLDeck & "<!DOCTYPE wml PUBLIC ""-//WAPFORUM//DTD WML 1.1//EN"" "
      sWMLDeck = sWMLDeck & """http://www.wapforum.org/DTD/wml_1.1.xml"">" & vbCrLf
      sWMLDeck = sWMLDeck & vbCrLf & "<wml>" & vbCrLf & vbTab
      sWMLDeck = sWMLDeck & "<card id=""main"" title=""POST TEST"">" & vbCrLf
      sWMLDeck = sWMLDeck & vbTab & vbTab & "<p>" & vbCrLf
      sWMLDeck = sWMLDeck & vbTab & vbTab & vbTab & "myVar1: " & sVar1 & "<br/>" & vbCrLf
      sWMLDeck = sWMLDeck & vbTab & vbTab & vbTab & "myVar2: " & sVar2 & vbCrLf
      sWMLDeck = sWMLDeck & vbTab & vbTab & "</p>" & vbCrLf & vbTab
      sWMLDeck = sWMLDeck & "</card>" & vbCrLf & ">/wml>"

      Response.ContentType = "text/vnd.wap.wml"
      Response.Write(sWMLDeck)

      'Quick function for picking out the values of the POSTed variables.
      'sKey is the variable name, sRaw is the POST string.
      Private Function getVar(sKey, sRaw)
      Dim sRetVal
    If InStr(sRaw, sKey) Then
    sRetVal = Mid(sRaw, InStr(sRaw, sKey) + Len(sKey) + 1)
    If InStr(sRetVal, "&") Then
    sRetVal = Mid(sRetVal, 1, InStr(sRetVal, "&") - 1)
    End If
    End If
    getVar = sRetVal
      End Function
    %>

  • 38. 爲什麼META標籤不工作?

        瀏覽器不支持默認的meta標籤,例如:

        <meta http-equiv="refresh" content="1;http://somewhere.com/"> 

        雖然有少量網關支持非常有限的META標記。但是測試顯示,如果使用了它們,網關就會出問題。例如某網關不支持普通的HTTP Cache控制,如果要實現Cache控制只好使用特殊的META標記。顯然從其他網關來的用戶就可能不支持這個META。注意:不要使用META tags。肯定有其他的方式來完成你的想法。

        最常使用的META是:

        <meta http-equiv="refresh" content="1;http://somewhere.com/"> 

        這個告訴瀏覽器重新裝入指定的WML頁面。WML中已經包含了一個<ontimer>。

  • 39. 爲什麼服務器接收不到用戶發送的參數?

        用戶輸入的參數或者其他參數可以像在HTML中一樣通過提交方式發送到服務器。在HTML中這個是<FORM>,POST或者GET。
        首先知道要知道POST和GET的區別。對於POST瀏覽器將生成一個數據包將變量名和它們的內容捆綁在一起,併發送到服務器。對於GET,它其實是一個URL請求,變量名和內容都包含在URL中。
        對於WAP環境,要求是非常嚴格的,必須要根據協議來操作。雖然以下的URL

        "/cgi-bin/somescript?username=john&telephone=123-123-1234&occupation=banana+bender"

        可以在HTML環境中工作,但是在WAP環境中無法工作。以上的部分編碼將使得保護的變量內容被誤解。特殊的空格(在 banana 和 bender )被轉成 “+”。 URL就根本沒有空格。
        以上的URL在WAP中無法工作的主要原因是用來分割每個變量和變量內容的 & (與號)沒有轉義。正確的格式應該是:

        "/cgi-bin/somescript?username=john&amp;telephone=123-123-1234&amp;occupation=banana+bender"

        在這裏 & 被名字實體所替換。爲了解釋更清楚些,請看下面的代碼:

    <card id="input" title="Gimme some data">
      <p><input type="text" name="username" format="M*m"/></p>
      <p><input type="text" name="occupation" format="M*m"/></p>
    <p>
    <anchor>Send this
    <go href="/cgi-bin/somescript?username=$(username)
    &amp;occupation=$(occupation)"/>
    </anchor>
    </p>

        注意這不是真正的WAP協議,專門的字符應該轉義,否則將得到不可預料的結果。

  • 40. 爲什麼在HTTP中的Referer看不見?

        當HTML瀏覽器從一個URL到另外一個URL的時候,它默認地會發送一個叫做 Referer的 HTTP頭給服務器,告訴它在瀏覽這個頁面之前的那個頁面。這是一個非常有用的特點,在WAP環境中同樣也有。但是既然這個信息來自用戶代理(瀏覽器)、WAP設備,通常爲了節約帶寬和時間,就被省略了。
        爲了使用 Referer ,應該使用新的URL標籤例如: <a>,<go>等等,並且加入參數:sendreferer。

            <go href="/somedir/somedeck.wml" sendreferer="true"/> 

        這樣就會把參考的URL發送到服務器。

  • 41. 如果沒有找到URL,有可能重新將用戶引導到另外一個WML卡片或者頁面嗎?

        是的。但這是服務器端的特點,與客戶端沒有關係。

  • 42. 爲什麼普通的HTTP 302重新導向不好使?

        這的確是一個事實。核心的問題是在服務端的腳本語言,而不是在服務端語言和服務器之間。
        所謂的302 Found HTTP反應是指服務器告訴用戶代理,它所需要的資源在另外的地方可以找到。302反應可能包括一個人們可理解的信息,如果在這種情況下“ Content-type: ”就被設置了。筆者所測試過的服務器,即使沒有內容也都加了“Content-type:”。默認的 “Content-type:” 是text/html。當然有些網關不喜歡這個類型。
        以下的例子已經經過測試,在Apache和Microsoft Internet Information Server都可以工作。如果使用其他的Web Server,或者其他的腳本語言,需要能轉換這些簡單的腳本。關鍵的工作是十分簡單的,除非需要,不用告訴服務器整個HTTP頭。大多數Web Server將自動完成這個HTTP頭,使得用戶代理可以理解。
        所有的代碼例子可以在線測試。如果它們能夠工作,用戶將被重新引導到http://wap.colorline.no/clientinfo.html ,在那兒將產生一個WML頁面來顯示所有的HTTP頭。
        PHP 代碼測試可以在 http://wap.colorline.no/wap-faq/apps/302test.php3中找到。

    <?
        header("Location: http://wap.colorline.no/clientinfo.html");
        header("Content-type: text/vnd.wap.wml";
    ?> 

        Perl測試代碼可以在http://wap.colorline.no/cgi-bin/302test.pl中找到。 

    print "Location: http://wap.colorline.no/clientinfo.html/n";
    print "Content-type: text/vnd.wap.wml/n"; 

        ASP測試代碼可以在 http://www.colorline.no/302test.asp中找到。 (注意不同的URL): 

    <%
        Response.Redirect = "http://wap.colorline.no/clientinfo.html";
        Response.ContentType = "text/vnd.wap.wml";
        Response.Flush
        Response.End
    %>

  • 43. 可能在WML中實現ASP Session嗎?

        不可能。可以把信息存儲在臨時變量中模擬Session。Session是保存在用戶PC上的“cookies”中。目前的WAP設備不支持“cookies”。不過下一代的設備和WML可能支持“cookies”。

  • 44. WAP支持Session嗎?

        在HTML中,一個十分普遍的“處理”用戶的方法就是爲每個用戶分配一個“session”。這個有時候是通過指定一個獨一無二的cookies來實現的。然而WAP的資源非常有限,因此session的處理必須以不同的方式來處理。
        Alex Kriegel 提供了一個安裝在 WAPlinks的Custom Session Object包。這個zip文件中包含了VB類的文件和編譯過的Dll文件,還有相關的文檔。這些可以在http://www.waplinks.com/customsessionobject.zip下載。
        另外一種方法是使用 PHPlib ,它是使用 PHP 編寫的。
        Tarique ([email protected]) 提供瞭如何使用PHPlib來驗證和處理每個WAP用戶。有相關的文件和註釋可以到下面地址下載:

        http://wap.colorline.no/wap-faq/archive/phplib_wml.zip

  • 45. 可以在WAP中使用Cookies嗎?

        在理論上是可以的,但不是所有的WAP設備都支持。另一個方法來管理會話是使用隱藏的fields(包含會話標識,無論是POST或者GET方式)。

  • 46. WAP支持Cookies嗎?

        普通的HTTP Cookies是作爲WAP的擴展來實現的。無論你以前聽到什麼,Cookies的支持將越來越好。實際上Phone.com的 UP.Link網關已經支持這個功能有一段時間了。
        可以使用以下的腳本語言檢測Cookie-support,:
            http://wap.colorline.no/wap-faq/apps/cookietest.php3
        腳本在http://wap.colorline.no/demos.html也可以得到。
        當第一次看見卡片的時候,記數器應該爲0。所有的Cache都被關閉。卡片通過在URL中隨機地加入變量來強制自己加載(筆者不推薦這種強制加載辦法)。當點擊增加計數連接,頁面將重新加載,卡片就再次出現,並且記數器變成1。
        在腳本中,Cookie的名字被稱做 TestCookie,它有很長的生命期,因此可以隔好幾天再來查看記數器,它將是上一次的數值。這要求你能使用與上一次訪問所使用的WAP環境一樣,否則將把你的數值清0。
        如果記數裝置一直都是0,那麼cookie 就沒有能傳送到你的Web Server。這個腳本也能表示Cookie是否被傳送。
        另外,這個腳本同樣還顯示HTTP頭中的HTTP_VIA 和 HTTP_USER_AGENT 。這些能夠得到所使用的網關和模式。一些網關使用HTTP_VIS標識自己,而另外一些使用HTTP_USER_AGENT,還有一些則讓程序無法知道。
        下面是它的PHP代碼。一個標準的 PHP setcookie() 函數只有在這種腳本語言中才會出現。函數只是簡單地設置cookie,並且PHP變量 $HTTP_COOKIE_VARS 用來讀取cookie。

    <?
    if(isset($HTTP_COOKIE_VARS["TestCookie"]))
    {// Check if TestCookie is set
          $cookieset = "set";

    // Read the Cookie
          $cookieid = $HTTP_COOKIE_VARS["TestCookie"];
      // and increase its value
          $cookieid++;
         }
        else {
      // cookie was not set
          $cookieset = "not set";
      // start counter at zero
          $cookieid = 0;
        }
      // apply the Cookie to the HTTP header
     setcookie("TestCookie",$cookieid);
      // set the content type for WML
        header("Content-type: text/vnd.wap.wml");

    // disable ALL caching
        header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
        header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
        header("Cache-Control: no-cache, must-revalidate");          
        header("Pragma: no-cache");                                  
        echo("<?xml version=/"1.0/"?>/n");
     echo("<!DOCTYPE wml PUBLIC /"-//WAPFORUM//DTD WML 1.1//EN/"
     /"http://www.wapforum.org/DTD/wml_1.1.xml/">/n/n");
     echo("<!-- This application attempts to test the capabilities of a WAP gateway to support     cookies -->/n");
        echo("<!-- App by [email protected] (c) 2000 -->/n");
      // Generate random value for reload forcing
        $random = mt_rand(100000,999999);
     ?>
      <wml>
      <head>

    // Even more cache disabling
    <meta forua="true" http-equiv="Cache-Control" content="must-revalidate"/> 
      </head>
      <card id="init" title="CookieTest">
      <p>
       Cookie "TestCookie" was <?echo($cookieset)?>.
       Value is currently "<?echo($cookieid)?>"
      </p>
      <p>

    <anchor>
    Increase value
    <go method="get" href="<?echo($PHP_SELF)?>?random=<?echo($random)?>"/>
    </anchor>
    </p>
    <p>Gateway: 
      <?
        if(isset($HTTP_VIA))
    { // Is there something in the HTTP_VIA variable?
          echo($HTTP_VIA);
        }
        else {
          if(isset($HTTP_USER_AGENT))
    { // Is there something in the HTTP_USER_AGENT variable?
            echo($HTTP_USER_AGENT);
          }
          else {
    // Absolutely no identifier was found
            echo("Unknown");
          }
        }
      ?>
      </p>
      </card>
      </wml>

  • 47. 如何使用WAP設備發送E-Mail?

        在HTML中有一個默認的E-Mail機制:“ mailto:” 。但在WML中不好使,因此E-Mails必須通過WML表單來解決。例如:

    <wml>
         <card id="edit" title="Email Editor">
          <p>From: <input type="text" name="from" format="*M"/></p>
          <p>To: <input type="text" name="to" format="*M"/></p>
          <p>Subject: <input type="text" name="subject" format="*M"/></p>
          <p>Message body: <input type="text" name="body" format="*M"/></p>
          <p>
            <anchor>Send this mail
              <go method="post" href="http://some.host/mailhandler"?action=send/">
                <postfield name="from" value="$(from)"/>
                <postfield name="to" value="$(to)"/>
                <postfield name="subject" value="$(subject)"/>
                <postfield name="body" value="$(body)"/>
              </go>
           </anchor>
          </p>
       </card>
    </wml> 

        在代碼中的http://some.host/mailhandler是一個CGI程序,它是服務端的腳本程序,將提交的表單轉換成E-Mail格式併發送出去。
        如果想使用一個類似於發信的過程,就需要編輯變量名。另外發送的數據是有限的,長信息可能需要打斷。
        爲了演示它是如何工作的,下面的 PHP 腳本可以用來處理Mail。它將格式化WML頁面,告訴用戶是否發出信件。在真實的應用中,應該加入檢測,例如:E-Mail的合法格式。

    <?
    // Tell the client that this is a WML deck
        header("Content-type: text/vnd.wap.wml");
        echo("<?xml version=/"1.0/"?>/n");
        echo("<!DOCTYPE wml PUBLIC /"-//WAPFORUM//DTD WML 1.1//EN/"
    /"http://www.wapforum.org/DTD/wml_1.1.xml/">/n");
    // The name of your mail server
        $mailer = "wap.colorline.no";
    // Format the from field
        $from = $from." (WAP user at ".$mailer.")";

    // Add the from field and some character handling to the extra headers
      $extraheaders = $from."/nContent-Type: text/plain;
    charset=iso-8859-1/nContent-Transfer-Encoding: 8bit";

    // Start sending out the WML deck
        echo("<wml>/n");
        if(mail($to,$subject,$body,$extraheaders))
    {// Use PHP's internal mail functionality
    // Mail was successfully sent
          echo("<card id=/"sent/" title=/"Mail sent/">/n");
          echo("<p>Mail was sent successfully</p>/n");
          echo("</card>/n");
        }
        else {
    // The mail could not be sent
          echo("<card id=/"notsent/" title=/"Mail failed/">/n"); 
          echo("<p>Unable to send mail</p>/n");
          echo("</card>/n");
        }
        echo("</wml>/n");
    ?>

        因爲安全性的原因,以上的代碼沒有演示程序。

  • 48. 可以在模擬器上操作本地的頁面,卻沒有辦法訪問Internet上的,有什麼問題嗎?

        大多數模擬器和工具都可以瀏覽Internet、Intranet和本機的頁面。但是在訪問一些大公司頁面的時候,必須通過代理服務器來取得進入Internet的權限。如果必須通過這個代理服務器來取得HTML頁面,那麼你的WAP模擬器也會取得權限來訪問Internet。
        注意到有些模擬器不支持代理服務器,但是大多數是支持的。在模擬器裏面設置這些是很簡單的。用戶所做的只需要將代理主機的名字、IP地址和端口號輸入就可以了。如果沒有找到,你可以在 systems/network 管理器裏面設置這些,也可以檢查 Netscape/IE的設置。
        在某些情況下,代理服務器使用 userid 和 password 來取得進入Internet的權限。有些模擬器支持用戶代理服務器,用戶應該能告訴模擬器相關的代理配置。
        在極少的情況下,使用代理服務器(如Microsoft Proxy Server,)的用戶會遇到更多的問題。這個代理服務器只接受一種驗證方式(userid/password)。這種驗證被稱做 NTLM ,並且是某種 MS 的驗證方式。幾乎很少有模擬器支持這種方式。因此最好是避免使用它,或者讓管理員使用“Basic Authentication”方式以避免更多的麻煩。

  • 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 ([email protected])提供的WML工具,包括WML二進制編譯和反編譯。
        Angus 和 Zygo WAP([email protected])已經開發出了一個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中,不可能做到這一點,每個鏈接都佔據自己的一行。

  • 轉自bolow的個人空間

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章