2013-09-06 16 views
7

Próbuję uzyskać podstawową komunikację JSON od klienta do serwera idzie, z następującego kodu Elm:Jak wysłać JSON pomiędzy Klientem Elm i Haskell (jesod) Serwer

import open Http 

result res = case res of 
    Success a -> a 
    Waiting -> "Waiting" 
    Failure n a-> "Failure " ++ (show n) ++ " " ++ (show a) 


main = lift asText <| lift (show . result) <| send <| constant <| post "http://localhost:3000" "{foo : true}" 

serwer jest dokładnie tak jak pokazano w this part of the Yesod book.

Jednak gdy uruchamiam żądania, ja wyprowadzał

"\"Failure 0 []\"" 

czy ktoś wie co mam zrobić, aby klient Elm prawidłowo komunikuje się z serwerem Yesod? Próbowałem klienta Python, a żądania działają dobrze. Podobnie jest kilka przykładów na stronie Yesod z pomyślnymi żądaniami HTTP, więc jestem przekonany, że obie biblioteki działają poprawnie, ale że używam ich źle.

AKTUALIZACJA: Problem dotyczy klienta. Udało mi się go uruchomić w wersji chrome z wyłączonymi opcjami bezpieczeństwa i bez zmian w Yesod. Poszukam obejścia, ale to przynajmniej wystarcza, aby mój rozwój był kontynuowany.

+0

EDYCJA: Brakuje mi nazwy hosta i wiadomości z wpisu. – jmite

Odpowiedz

7

Jest to spowodowane ochroną skryptów między witrynami w niektórych witrynach. To było ostatnio brought up na listach dyskusyjnych Elm (przeze mnie). Obecnie nie istnieje obejście tego problemu, jeśli chcesz używać określonego serwera, chociaż miałem szczęście hostować pliki w katalogu, w którym go uruchomiłeś.

Powinieneś sprawdzić konsolę javascript a zobaczysz coś takiego jak XMLHttpRequest cannot load http://www.google.com/. Origin http://localhost:8000 is not allowed by Access-Control-Allow-Origin.. Jeśli tego nie zrobisz, jest to zupełnie nowy problem. Ale wątpię w to.

+0

Piszę więc do localhost i mam pełną kontrolę nad serwerem Yesod ... czy mogę wyłączyć funkcję bezpieczeństwa? Ponadto, gdy uruchomię go z konsoli, otrzymuję następujący komunikat o wpisie: [22: 35: 12.380] POST http: // localhost: 3000/[HTTP/1.1 200 OK 19ms] Wygląda na to, że serwer wraca wiadomość i Wiąz po prostu nie wie, co z nią zrobić ... – jmite

+0

@jmite Odradzam wyłączanie zabezpieczeń na serwerze, a ponadto może być w przeglądarce. Podejrzewam, że przeglądarka nie pozwala Elmowi zobaczyć odpowiedzi, ponieważ może być złośliwy w oparciu o charakterystykę XSS. – mgold

+0

Hmm, interesujące. Szczerze mówiąc, mój serwer jest po prostu lokalny, przez jakiś czas nie będzie odtwarzany, więc mogę wyłączyć tę kwestię jako obejście, dopóki nie zostanie napisana prawdziwa łatka ... – jmite

4

Chyba serwer musi wysłać Cors-nagłówki, omówionych w przykładzie w tym SO post: Allowing cross-origin requests in Yesod

Więcej informacji o CORS w MDN i Wikipedia

Należy pamiętać, że przeglądarka myśli swoje robią Krzyż -Origin wnioski jeśli

  • nazwa domeny różni się np próbie pobrania danych z foobar.com w danej lokalizacji przeglądarek masz barfoo.com
  • poddomena jest inna, na przykład twoja aplikacja żyje w foobar.com i próbujesz pobrać dane z api.foobar.com
  • porty różnią się, na przykład twoja aplikacja przeglądarkowa znajduje się w localhost: 8000 i próbujesz pobrać dane z localhost: 8001