Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xpath XQuery解码HTTP请求-无法分析查询_Xpath_Xquery_Exist Db - Fatal编程技术网

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

Xpath XQuery解码HTTP请求-无法分析查询,xpath,xquery,exist-db,Xpath,Xquery,Exist Db,在XQuery 3.1(eXist db 4.4下)中,我接收到对a控制器的搜索请求,在a控制器中,我从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}/se

在XQuery 3.1(eXist db 4.4下)中,我接收到对a控制器的搜索请求,在a控制器中,我从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=some%+text
    中,则站点会向
  • org.eclipse.jetty.http.BadMessageException:400:无法解析URI查询 java.lang.IllegalArgumentException:编码“%+t”无效

  • 如果请求进入
    /search?text=some+text
    ,则控制器将通过
    sometext
    ,而不带允许的
    +
    符号
  • 谷歌搜索这一点并没有让我找到一个解决方案,但我在管理HTTP解析方面没有经验,可能对这个问题理解不够,无法搜索到解决方案


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

    函数,如
    util:unescape uri
    escape uri
    是您的朋友。 由于您正在使用的字符串是通过http发送的,因此将对其进行转义。通过在中搜索
    escape
    ,可以了解有关可用转义函数的更多信息


    <> >对于更详细的操作,请考虑<代码>规范Unicode < /Code >

    < P>当通过<代码>请求:GET-PosialEnter()/Code >获取参数时,您不需要脱掉URI编码的参数。代码>%20和
    +
    自动作为空格字符交给您

    事实上,一个问题是有人可能会将一个“禁止”字符转储到搜索字符串中,例如我给出的示例
    some%+text
    。我不知道当它击中控制器时会发生什么-因此我无法想出一个处理它的策略。最好的办法是,imv可以在输入表单中进行uri编码,在xquery中进行uri解码。如果确实要限制字符(
    ǚ
    ,` ` )  ppl可以搜索,更复杂的函数是必要的。但基本思想保持不变,编码输入解码用于处理是的,输入以我可以处理的形式进行编码。我正在尝试处理用户直接在浏览器中写入字符串的意外情况(在第一个示例中)。当通过请求获取参数时:获取参数您不需要取消对URI编码的参数的扫描。%20和+将通过空格字符自动传递给您。@joewiz我简直不敢相信我花了好几个小时都没有弄明白这一点(现在很明显)事实。如果你把它作为一个答案,我会接受。它可能对未来的搜索者有用。再次感谢。
    
    declare function search:search-term-cleaner($text as xs:string?) as xs:string?
    {
        let $cleanterm := replace($text,'[^A-Za-z\+*0-9]', '')
    
        return $cleanterm
    };