You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 23:05:16