Yaws出现{badmatch,{error,invalid_uri}}异常,含+的URL报错求助
问题分析与解决建议
问题场景
当请求的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}]}
出错代码片段(第506-507行):
Http_result = httpc:request(Url), {ok, {{V, S, R}, _, _}} = Http_result,
关键问题点
虽然URL中的+(等价于%20)是合法的空格编码,但Erlang的httpc模块对URI的解析有严格要求:
- 传入
httpc:request的Url可能只是路径部分(比如/search?search=Thrust+washers),而非完整的http://xxx.com/search?search=Thrust+washers格式,httpc无法识别相对路径。 - 部分旧版本
httpc对手动拼接的编码字符兼容性较差,需确保URI完全符合RFC标准。
调试与解决步骤
- 检查Url实际值:在第506行前添加日志,打印
Url具体内容,确认是否为完整绝对URI:error_logger:info_msg("Requesting URL: ~p~n", [Url]), Http_result = httpc:request(Url), - 补全完整URI:如果
Url是相对路径,拼接服务的域名和协议:BaseUrl = "http://your-domain.com", FullUrl = BaseUrl ++ "/search?search=Thrust+washers", Http_result = httpc:request(FullUrl), - 规范参数编码:使用
http_uri:encode/1函数对查询参数编码,避免手动拼接的编码问题:Param = http_uri:encode("Thrust washers"), FullUrl = "http://your-domain.com/search?search=" ++ Param, - 优化异常处理:不要直接强制匹配
{ok, ...},先判断返回值避免进程崩溃:case httpc:request(Url) of {ok, {{V, S, R}, _, _}} -> % 正常业务逻辑 {error, Reason} -> error_logger:error_msg("HTTP request failed: ~p~n", [Reason]), % 错误处理逻辑 end
内容的提问来源于stack exchange,提问作者kklepper
相关产品推荐
相关产品推荐

