两个连续的HTTP请求

时间:2014-11-03 11:25:17

标签: frp elm

抱歉新手的问题(以及我的英文):)

我尝试编写以下函数:

  • 该函数从 URL1 下载内容(作为参数收到)
  • 该函数解析此内容并提取 URL2
  • 该功能从 URL2
  • 下载内容
  • 来自 URL2 的内容是此功能的结果
  • 如果发生错误,此函数应返回Nothing

我知道如何执行HTTP请求。我有一个函数来解析来自 URL1 的请求。但我不知道如何:

  • 使用解压缩的 URL2
  • 执行新请求
  • 如果未提取 URL2 (或 URL1 中发生错误),则忽略第二个请求

2 个答案:

答案 0 :(得分:1)

发送Http意味着与外界交谈,其中涉及Signal在榆树。因此, URL2 的最终结果将包含在Signal中。只要您对此感到满意,您就可以使用if来返回MaybeSignal的内容。例如:

import Maybe
import Http

-- helper functions
isSuccess : Http.Response a -> Bool
isSuccess response = case response of
  Http.Success _ -> True
  _              -> False

responseToMaybe : Http.Response a -> Maybe.Maybe a
responseToMaybe response = case response of
  Http.Success a -> Just a
  _              -> Nothing

parseContentAndExtractUrl : String -> String
parseContentAndExtractUrl = identity -- this still requires your implementation

-- URL1
startUrl : String
startUrl = "www.example.com" -- replace this with your URL1

result1 : Signal (Http.Response String)
result1 = Http.sendGet <| constant startUrl

-- URL2
secondUrl : Signal String
secondUrl = result1
  |> keepIf isSuccess (Http.Success "")
  |> lift (\(Http.Success s) -> s)
  |> lift parseContentAndExtractUrl

result2 : Signal (Maybe String)
result2 = secondUrl
  |> Http.sendGet
  |> lift responseToMaybe

请注意,有计划让所有这些更容易使用:https://groups.google.com/d/topic/elm-discuss/BI0D2b-9Fig/discussion

答案 1 :(得分:0)

我原则上你想要这样的东西:

import Maybe
import Http

type Url = String
getContentFromUrl : Maybe Url -> Maybe String
getContentFromUrl url = --your implementation
extractUrlFromContent : Maybe String -> Maybe Url
extractUrlFromContent content = --your implementation
content = getContentFromUrl (Just "http://example.com") 
          |> extractUrlFromContent 
          |> getContentFromUrl