【问题标题】:Erlang: ibrowse - get redirected URLErlang: ibrowse - 获取重定向的 URL
【发布时间】:2012-09-19 22:45:48
【问题描述】:

我正在为 Erlang 使用 ibrowse API。问题是,当我尝试阅读重定向到另一个网页的网页时,它会变成空白。关于如何跟踪到最后一页的任何想法?

这是我目前拥有的:

get_web(Src) ->
    ibrowse:start(),
    {_,_,_,Body} = ibrowse:send_req(Src, [], get),
    Body.

谢谢

【问题讨论】:

    标签: erlang


    【解决方案1】:

    如果响应中的 Location 标头具有 301 或 302 状态代码,则应遵循该标头。

    get_web({url,Src}) ->
      ibrowse:start(),
      {ok, Status, Head, Body} = ibrowse:send_req(Src, [], get),
      if
        Status =:= 200 ->
          Body;
        Status =:= 301 orelse Status =:= 302 ->
          get_web(get_location(Head))
      end.
    
    get_location(Head) ->
      case lists:keyfind("Location", 1, Head) of
        false -> {url, error};
        URL -> {url, URL}
      end.
    

    【讨论】:

      【解决方案2】:

      如果有人偶然发现了这一点,这就是我所做的:

      get_web({_,error}) ->
          error;
      
      get_web({url,Src}) ->
          ibrowse:start(),
          {_,_,Head,Body} = ibrowse:send_req(Src, [], get),
          if
              length(Body) == 0 ->
                  get_web(get_location(Head));
              true ->
                  Body
          end.
      
      get_location([]) ->
          {url,error};
      get_location([{"Location",URL}|_]) ->
          {url,URL};
      get_location([_|T]) ->
          get_location(T).
      

      【讨论】:

      • 我不认为这是正确的,因为一些网站提供了一个带有 href 的虚拟 html sn-p 到新页面以进行重定向。最好检查状态码是否为302,然后使用Location 标头。这就是状态码的用途;)
      猜你喜欢
      • 2017-07-11
      • 2013-09-07
      • 1970-01-01
      • 2013-02-24
      • 1970-01-01
      • 1970-01-01
      • 2011-07-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多