跳轉到內容

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 狀態程式碼

[編輯 | 編輯原始碼]

關於是否應該返回 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... :)
華夏公益教科書