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
};
有两个问题,在两种稍微不同的情况下:
- 如果收到请求
/search?text=some%+text
网站会投诉
org.eclipse.jetty.http.BadMessageException: 400: Unable to parse URI query
java.lang.IllegalArgumentException: Not valid encoding '%+t'
- 如果请求进入
/search?text=some+text
,控制器通过 sometext
没有 允许的 +
符号
谷歌搜索并没有让我找到解决方案,但我在管理 HTTP 解析方面没有经验,可能对问题的理解不足以搜索解决方案。
这是通过本地主机 http://localhost:8081/exist/apps/
。
util:unescape-uri
和 escape-uri
等功能是您的朋友。
由于您正在使用的字符串是通过 http 发送的,因此它将进行转义。您可以通过在 function documentation
中搜索 escape
来了解有关可用转义函数的更多信息
要进行更精细的操作,请考虑 normalize-unicode
通过 request:get-parameter()
获取参数时,您不需要对 URI 编码的参数进行转义。 %20
和 +
会自动作为 space 个字符交给您。
在 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
};
有两个问题,在两种稍微不同的情况下:
- 如果收到请求
/search?text=some%+text
网站会投诉
org.eclipse.jetty.http.BadMessageException: 400: Unable to parse URI query java.lang.IllegalArgumentException: Not valid encoding '%+t'
- 如果请求进入
/search?text=some+text
,控制器通过sometext
没有 允许的+
符号
谷歌搜索并没有让我找到解决方案,但我在管理 HTTP 解析方面没有经验,可能对问题的理解不足以搜索解决方案。
这是通过本地主机 http://localhost:8081/exist/apps/
。
util:unescape-uri
和 escape-uri
等功能是您的朋友。
由于您正在使用的字符串是通过 http 发送的,因此它将进行转义。您可以通过在 function documentation
escape
来了解有关可用转义函数的更多信息
要进行更精细的操作,请考虑 normalize-unicode
通过 request:get-parameter()
获取参数时,您不需要对 URI 编码的参数进行转义。 %20
和 +
会自动作为 space 个字符交给您。