XQuery 解码 HTTP 请求 - 无法解析查询

XQuery decoding HTTP request - unable to parse query

在 XQuery 3.1 中(在 eXist-db 4.4 下)我收到了对控制器的搜索请求,我在其中根据 URL 的查询字符串 text 创建了一个参数 docset

else if (starts-with(lower-case($exist:path), "/search")) then
  <dispatch xmlns="http://exist.sourceforge.net/NS/exist">
    <forward url="{$exist:controller}/search.html"/>
      <view>
        <forward url="{$exist:controller}/modules/view.xql">
          <add-parameter name="docset" 
                  value="{search:search-term-cleaner(request:get-parameter("text","norequest"))}"/> 
          <add-parameter name="pagetype" value="search"/>
        </forward>
      </view>
  </dispatch>

我清除所有传入的此类请求 /search?text="" 以仅允许某些字符进入搜索查询:

declare function search:search-term-cleaner($text as xs:string?) as xs:string?
{
    let $cleanterm := replace($text,'[^A-Za-z\+*0-9]', '')

    return $cleanterm
};

有两个问题,在两种稍微不同的情况下:

  1. 如果收到请求 /search?text=some%+text 网站会投诉

org.eclipse.jetty.http.BadMessageException: 400: Unable to parse URI query java.lang.IllegalArgumentException: Not valid encoding '%+t'

  1. 如果请求进入 /search?text=some+text,控制器通过 sometext 没有 允许的 + 符号

谷歌搜索并没有让我找到解决方案,但我在管理 HTTP 解析方面没有经验,可能对问题的理解不足以搜索解决方案。

这是通过本地主机 http://localhost:8081/exist/apps/

util:unescape-uriescape-uri 等功能是您的朋友。 由于您正在使用的字符串是通过 http 发送的,因此它将进行转义。您可以通过在 function documentation

中搜索 escape 来了解有关可用转义函数的更多信息

要进行更精细的操作,请考虑 normalize-unicode

通过 request:get-parameter() 获取参数时,您不需要对 URI 编码的参数进行转义。 %20+ 会自动作为 space 个字符交给您。