Haskell Scotty и Elm Http NetworkError

Harold Fincher спросил: 12 мая 2018 в 04:21 в: haskell

Я хотел заглянуть в веб-разработку с помощью haskell для back-end и elm для front-end. Поэтому я написал эти два простых фрагмента кода кода "hello world"

elm:

import Html exposing (..)
import Html.Events exposing (..)
import Http
import Json.Decode as Decodemain : Program Never Model Msg
main = Html.program
  { view = view
  , update = update
  , init = ("default", Cmd.none)
  , subscriptions = \_ -> Sub.none }type alias Model = Stringtype Msg = Get | Response (Result Http.Error String)update : Msg -> Model -> (Model, Cmd Msg)
update msg model = case msg of
  Get -> (model, get)
  Response (Ok s) -> (s, Cmd.none)
  Response (Err e) -> (toString e, Cmd.none)view : Model -> Html Msg
view model = div []
  [button [onClick (Get)] [text "click me"],
   text model]get : Cmd Msg
get =  let url = "http://localhost:3000/get"
       in Http.send Response (Http.get url Decode.string)

haskell / scotty:

import Web.Scottymain = scotty 3000 $ get "/get" $ json ("hello world" :: String)

оба работают отлично сами по себе - это означает, что код вяза может получать данные с серверов, таких как httpbin, и сервер scotty обрабатывает запросы, которые я отправляю с помощью браузера или таких инструментов, как wget / curl и т. д., но когда я пытаюсь использовать их вместе вызов http.send в elm возвращает ошибку сети.

Я подозреваю, что это может быть проблема, когда оба сервера размещены на одном компьютере (не знаю, почему, но я хотел исключить возможность), поэтому я размещал клиентский сайт на другом компьютере, который, как я знаю, имеет рабочее соединение с компьютером, на котором размещен back-end (работает с wget и т. д.), но он все равно не работает.

Мне не хватает чего-то очевидного , или в чем проблема? thx заранее

2 ответа

Chad Gilbert ответил: 12 мая 2018 в 04:29

Похоже, что ваша проблема связана с ограничениями, связанными с перекрестными запросами (CORS). Вы можете использовать wai-cors для установки политики CORS.

Пример:

import Web.Scotty
import Network.Wai.Middleware.Corsmain = scotty 3000 $ do
    middleware simpleCors
    get "/get" $ json ("hello world" :: String)
Harold Fincher ответил: 12 мая 2018 в 04:31
да удивительный thx! работает отлично!