erlang 偏航异常:{错误匹配,{错误,无效URI}}由+导致

o4hqfura  于 2022-12-08  发布在  Erlang
关注(0)|答案(1)|浏览(175)

我找不到abs_path是“/search?search=Thrust+washers”的问题,更不知道如何调试。

Class: error

Exception: {badmatch,{error,invalid_uri}}

Req: {http_request,'GET',{abs_path,"/search?search=Thrust+washers"},{1,1}}

Stack: [{myurl,pass_through,1,
               [{file,"/usr/local/lib/yaws/voxx/ebin/myurl.erl"},{line,507}]},

Line 506:
    Http_result = httpc:request(Url),
    {ok, {{V, S, R}, _, _}} = Http_result,

它似乎是由URL中的+(或%20)字符引起的,但这些字符完全法律的。
我找到了Yaws process died: {{badmatch,<<>>}和史蒂夫维诺斯基的答案,但由于缺乏经验而不能利用它。

3pmvbmvn

3pmvbmvn1#

我不知道您的应用程序的确切性质,但我猜它所做的是Yaws接收到一个URL请求,其中包含您所显示的数据,然后您的代码试图使用Yaws解析的URL作为HTTP客户端发出请求。
我认为查询中的“+”字符必须是URL编码的,因为“+”在“统一资源标识符(URI):通用语法”规范,第2.2节(RFC 3986);它通常用于表示查询中的空格字符。
使用uri_string module中的Erlang函数编写查询,我们看到它被编码:

1> uri_string:compose_query([{"search", "Thrust+washers"}]).
"search=Thrust%2Bwashers"
2> uri_string:dissect_query("search=Thrust%2Bwashers").
[{"search","Thrust+washers"}]

我们在Python中看到了同样的情况:

>>> import urllib.parse
>>> urllib.parse.urlencode({'search': 'Thrust+washers'})
'search=Thrust%2Bwashers'

如果您使用一个URL向Yaws发出curl请求,并以这种方式对查询进行编码,Yaws会将您的查询解码为您所期望的{"page","x+y"}

相关问题