跳轉到內容

XQuery/獲取 POST 資料

來自華夏公益教科書,自由的教科書

您想建立一個 XQuery 來訪問 HTTP POST 中的資料。

為此,您使用 request:get-data() XQuery 函式。

示例 echo-post.xq

[編輯 | 編輯原始碼]
xquery version "1.0";

(: echo-post.xq: Return all data from an HTTP post to the caller. :)

declare namespace exist = "http://exist.sourceforge.net/NS/exist";
declare namespace xmldb="http://exist-db.org/xquery/xmldb";
declare namespace request="http://exist-db.org/xquery/request";

declare option exist:serialize "method=xml media-type=text/xml indent=yes";

let $post-data := request:get-data()

return
<post-data>
   {$post-data}
</post-data>

上面的程式(稱為 echo-post.xq)對於測試您的 Web 表單非常有用。它只獲取傳送到 XQuery 服務的資料,並將其包裝在 <post-data> 標記中返回。

有時 HTTP POST 語句將其資料放在引數中。例如,RichTextEditor CKEdit 有多個文字區域,每個區域可能都包含以編碼形式的 HTML 標記。在這種情況下,您也可以在 HTTP POST 資料上使用 request:get-parameter。

在您的伺服器從 CKEditor 客戶端獲取 POST 後,伺服器將使用以下內容

示例 XQuery 來回顯 POST 資料

[編輯 | 編輯原始碼]

在 _samples 資料夾中,您會發現有關如何使用 CKEditor 的幾個示例。這些 HTML 檔案中的每一個都有一個 HTML 表單,其中包含以下行

  <form action="sample_posteddata.xq" method="post">

以下程式可以用作 sample_postdata.php 檔案的替代品。

sample_postdata.xq

xquery version "1.0";
declare option exist:serialize "method=xml media-type=text/xml omit-xml-declaration=yes indent=yes";

(: Get the content of the editor1 parameter :)
let $editor1 := request:get-parameter('editor1', '')

(: wrap the content in a div to make sure we have well-formed XML :)
let $wrapped-content := concat('&lt;div&gt;', $editor1, '&lt;/div&gt;')

(: parse the escaped text so that we now have true XML markup :)
let $data-to-save := util:parse($wrapped-content)
return
<results>
  {$data-to-save}
</results>

檢視 URL 編碼引數

[編輯 | 編輯原始碼]

標準 HTML 表單使用一種稱為 URL 編碼表單資料的傳輸格式。

URL 編碼資料具有以下 MIME 型別

Content-Type="application/x-www-form-urlencoded"

xquery version "1.0";

let $title := 'Echo Post'

return
<results>
  <title>{$title}</title>
  <get-data>
  {request:get-data()}
  </get-data>
  <headers>
     {for $header in request:get-header-names()
     return
        <header name="{$header}" value="{request:get-header($header)}"/>
  }
  </headers>
  
  <parameters>
  {for $parameter in request:get-parameter-names()
     return
        <parameter name="{$parameter}" value="{request:get-parameter($parameter, '')}"/>
  }
  </parameters>
</results>

如果您有以下表單

<html>
    <head><title></title></head>
    <body>   
        <form action="echo-post.xq" method="post">
            First name: <input type="text" name="FirstName" value="Mickey" /><br />
            Last name: <input type="text" name="LastName" value="Mouse" /><br />
            <input type="submit" value="Send HTTP Post to Server" />
        </form>    
    </body>
</html>

那麼它將從 echo-post.xq 返回以下結果

<results>
    <title>Echo Post</title>
    <get-data/>
    <headers>
        <header name="Host" value="demo.danmccreary.com"/>
        <header name="User-Agent" value="Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2.23) Gecko/20110920 Firefox/3.6.23"/>
        <header name="Accept" value="text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"/>
        <header name="Accept-Language" value="en-us,en;q=0.5"/>
        <header name="Accept-Encoding" value="gzip,deflate"/>

        <header name="Accept-Charset" value="ISO-8859-1,utf-8;q=0.7,*;q=0.7"/>
        <header name="keep-alive" value="115"/>
        <header name="Connection" value="keep-alive"/>
        <header name="Referer" value="http://demo.danmccreary.com/rest/db/dma/apps/xforms-examples/unit-tests/html-form-post.html"/>
        <header name="Content-Type" value="application/x-www-form-urlencoded"/>
        <header name="Content-Length" value="31"/>
    </headers>
    <parameters>
        <parameter name="FirstName" value="Mickey"/>

        <parameter name="LastName" value="Mouse"/>
    </parameters>
</results>
華夏公益教科書