Хаскелл Скотти и Элм Http NetworkError - PullRequest
0 голосов
/ 05 июня 2018

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

elm:

import Html exposing (..)
import Html.Events exposing (..)
import Http
import Json.Decode as Decode

main : Program Never Model Msg
main = Html.program
  { view = view
  , update = update
  , init = ("default", Cmd.none)
  , subscriptions = \_ -> Sub.none }

type alias Model = String

type 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.Scotty

main = scotty 3000 $ get "/get" $ json ("hello world" :: String)

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

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

Я что-то упускаю из виду или в чем проблема?спасибо заранее

1 Ответ

0 голосов
/ 05 июня 2018

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

Пример:

import Web.Scotty
import Network.Wai.Middleware.Cors

main = scotty 3000 $ do
    middleware simpleCors
    get "/get" $ json ("hello world" :: String)
...