当运行以下程序elm-reactor(或使用elm-make该问题)时,我发现它实际上是唯一的网页GET是httpbin.否则,我会看到Http.NetworkError,即使在可靠的网站上,例如" http://google.com "或" http://stackoverflow.com ".关于为什么会这样,我完全糊涂了,有人能指出我的错误吗?
module Main (..) where
import Http
import Html exposing (..)
import Effects
import Html.Events as Events
import StartApp
import Task
-- MODEL
type alias Model =
{ output : String }
type Action
= Response String
| Request String
| HTTPError Http.Error
-- UPDATE
update : Action -> Model -> ( Model, Effects.Effects Action )
update act mod =
case act of
Response str ->
( { mod | output = str }, Effects.none )
Request srv ->
let
effects =
srv
|> Http.getString
|> Task.map Response
|> flip Task.onError (Task.succeed << HTTPError)
|> Effects.task
in
( { mod | output = "GET: " ++ srv }, effects )
HTTPError err ->
( { mod
| output =
"Error: "
++ case err of
Http.Timeout ->
"Timeout"
Http.UnexpectedPayload str ->
"Unexpected payload: " ++ str
Http.BadResponse code str ->
"Bad response: " ++ toString code ++ ": " ++ str
Http.NetworkError ->
"Network error"
}
, Effects.none
)
-- VIEW
view : Signal.Address Action -> Model -> Html.Html
view address mod =
div
[]
[ div
[]
[ input
[ Events.on "input" Events.targetValue (Request >> Signal.message address) ]
[]
]
, div [] [ text mod.output ]
]
-- MAIN
app : StartApp.App Model
app =
StartApp.start
{ init = ( { output = "No requests made" }, Effects.none )
, update = update
, view = view
, inputs = []
}
main =
app.html
port tasks : Signal (Task.Task Effects.Never ())
port tasks =
app.tasks
Run Code Online (Sandbox Code Playgroud)
您很可能遇到跨源浏览器限制.当您发出失败请求时,请查看您的浏览器JavaScript控制台.Chrome会记录如下错误:
XMLHttpRequest无法加载https://www.stackoverflow.com/.请求的资源上不存在"Access-Control-Allow-Origin"标头.因此,不允许来源" http://elm-lang.org "访问.
您的httpbin示例链接包含HTTP标头Access-Control-Allow-Origin: *,这是限制性最小的设置.
通过查找有关CORS(代表Cross Origin Http Request)的信息,您可以阅读有关这些类型的问题以及解决这些问题的方法.
| 归档时间: |
|
| 查看次数: |
313 次 |
| 最近记录: |