2012-01-14 39 views
6

Tôi đang cố gắng tạo một API REST RESTI bằng cách sử dụng Happstack. Nó sẽ cho phép POSTS với một cơ thể JSON. Tôi có thể làm cái này như thế nào? Tất cả các chức năng trong API của happstack dường như nhìn mọi thứ dựa trên tên tham số. Nó nghĩ cơ thể luôn được mã hóa url.Làm thế nào để tạo JSON Rest API với Happstack? Cơ thể JSON?

Nếu không thể xảy ra với Happstack, tôi nên sử dụng framework nào?

Trả lời

6

Được rồi, đây là những gì tôi đã tìm ra.

{-# LANGUAGE OverloadedStrings, DeriveDataTypeable #-} 
import qualified Data.ByteString.Lazy.Char8 as L 
import Happstack.Server 
import Happstack.Server.Types 
import Control.Monad.IO.Class (liftIO) 

import Data.Data (Data, Typeable) 

-- easiest to serialize/deserialize objects 
data Unit = Unit { x :: Int, y :: Int } deriving (Show, Eq, Data, Typeable) 

-- put this function in a library somewhere 
getBody :: ServerPart L.ByteString 
getBody = do 
    req <- askRq 
    body <- liftIO $ takeRequestBody req 
    case body of 
     Just rqbody -> return . unBody $ rqbody 
     Nothing  -> return "" 

myRoute :: ServerPart Response 
myRoute = do 
    body <- getBody -- it's a ByteString 
    let unit = fromJust $ A.decode body :: Unit -- how to parse json 
    ok $ toResponse $ A.encode unit -- how to send json back. 
+1

Đó là giải pháp đúng. Mã trong Happstack.Server.RqData là để xử lý các dữ liệu được mã hóa url và nhiều/form-data. Nếu bạn chỉ cần phần thân yêu cầu thô, thì bạn chỉ cần lấy nó bằng takeRequestBody. Tại một thời điểm nào đó sẽ có phần AJAX/JSON trong khóa học bị lỗi. – stepcut

+0

@Sean Clark, tôi thấy <- được sử dụng rộng rãi trong mã này. Nó là một tuyên bố chuyển nhượng (hoặc) nhiều hơn nó ?? như 'body <- getBody'. Giá trị trả về của getBody được trao cho biến số cơ thể –

+0

@MadhavanKumar hơn thế. Xem các bản cover và ghi chú – Bladt

Các vấn đề liên quan