XQuery/检查必需参数
外观
< XQuery
您希望检查必需参数,并在缺少必需参数时返回有用的错误消息。
为了解决这个问题,我们将使用 get-parameter 函数,并且仅在参数存在时返回结果。如果参数不存在,我们将返回有用的错误消息。
xquery version "1.0"; declare namespace request="http://exist-db.org/xquery/request"; let $parameter-1 := request:get-parameter('p1', '') return if (not($parameter-1)) then ( <error> <message>Parameter 1 is missing. Parameter 1 is a required parameter for this XQuery.</message> </error>) else ( <results> <message>Parameter 1={$parameter-1}</message> </results> )
如果您没有提供必需的参数,将产生以下结果
<error> <message>Parameter 1 is missing. Parameter 1 is a required parameter for this XQuery.</message> </error>
以下示例检查多个参数。在这种情况下,如果参数 1 或参数 2 丢失,将生成错误。
xquery version "1.0"; declare namespace request="http://exist-db.org/xquery/request"; declare option exist:serialize "method=xhtml media-type=text/xml indent=yes"; let $parameter-1 := request:get-parameter('p1', '') let $parameter-2 := request:get-parameter('p2', '') return if (not($parameter-1) or not($parameter-2)) then ( <error> <message>Parameter 1 or 2 is missing. Both arguments required for this XQuery.</message> <message>Parameter 1={$parameter-1}</message> <message>Parameter 2={$parameter-2}</message> </error>) else ( <results> <message>Parameter 1={$parameter-1}</message> <message>Parameter 2={$parameter-2}</message> </results> )
请注意,以下逻辑是等效的
if (not($parameter-1) or not($parameter-2))
if (not($parameter-1 and $parameter-2))
有时第二种形式更容易阅读。
关于是否应该返回 HTTP 错误代码(例如 400 错误)存在很多讨论。一般来说,如果对参数的检查是您 **业务逻辑** 的一部分,而不是通信协议的一部分,那么您永远不应该返回 HTTP 代码。这告诉调用应用程序他们得到了正确的基本 URL,并且没有权限问题,但应用程序逻辑检测到错误。然后,客户端应用程序应该了解如何解析错误文档并将相关错误消息显示给用户。
有关更多详细信息,请参见 HTTP 状态代码列表
很多时候,URL 参数用于从应用程序中的数据集合中打开特定文件。
您可以使用 **doc-available()** 函数和以下代码示例来检查文件的是否存在
$app-data-collection := '/db/apps/my-app/data'
let $file := request:get-parameter('file', '')
(: check for required parameter :)
return if (not($file)) then
<error>
<message>URL Parameter file is a required parameter'</message>
</error>
else
let $file-path := concat($app-data-collection, '/', $file)
(: check that the file is available :)
return if (not(doc-available($file-path))) then
<error>
<message>Document {$file-path} does not exist</message>
</error>
else
(: normal processing here... :)