跳转到内容

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>
华夏公益教科书