代码之家  ›  专栏  ›  技术社区  ›  jbrehr

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

  •  1
  • jbrehr  · 技术社区  · 6 年前

    在XQuery3.1(在exist db 4.4下)中,我接收到对控制器的搜索请求,在该控制器中创建一个参数 docset 从URL的查询字符串 text :

    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:无法分析URI查询 java.lang.illegalargumentException:编码“%+T”无效

    1. 如果请求出现 /search?text=some+text ,控制器通过 sometext 没有 允许的 + 签名

    谷歌这还没有引导我找到一个解决方案,但我在管理HTTP解析方面没有经验,可能无法足够了解问题,无法搜索解决方案。

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

    2 回复  |  直到 6 年前
        1
  •  1
  •   Joe Wicentowski    6 年前

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

        2
  •  1
  •   duncdrum    6 年前

    功能,例如 util:unescape-uri escape-uri 是你的朋友。 因为您使用的字符串是通过HTTP发送的,所以它将进行转义。通过搜索 escape function documentation

    对于更详细的操作,请考虑 normalize-unicode