2016-05-20 11 views
1

я использую Haskell с servant-0.7.1 Ф.О. реализации server.Below мой исходный код:Использование Ajax в Слуге

type UserRestAPI 
    = "rest" :> "users" :> Get '[JSON] [User] 
    :<|> "rest" :> "user" :> ReqBody '[JSON] User :> Post '[PlainText] Text 


serverUserRestAPI :: ServerT UserRestAPI AppM 
serverUserRestAPI = usersGet :<|> userPost 

userPost :: User -> AppM Text 
userPost user = do 
    newUser <- runDb $ do insert user 
    liftIO $ putStrLn $ show newUser 
    return $ append (toPathPiece newUser) "\r\n" 

Модель User:

let mongoSettings = (mkPersistSettings (ConT ''MongoContext)) {mpsGeneric = False} 
    in share [mkPersist mongoSettings, mkMigrate "migrateAll"] [persistLowerCase| 
User 
    fam String 
    im String 
    ot String 
    email String 
    login String 
    pswd String 
    deriving Show 
|] 

$(deriveJSON defaultOptions ''User) 

Для testin curl был использован, как показано ниже ,

curl --verbose --request POST --header "Content-Type: application/json" \ 
    --data '{"userFam": "Fam", "userIm": "Im", "userOt": "Ot", "userEmail": "[email protected]", "userLogin": "test", "userPswd": "test"}' \ 
    http://127.0.0.1:3000/rest/user 

Все работает. Данные добавлены в базу данных. Но когда я использую ajax из бэкэнд, как показано ниже.

var formElement = $("#id_form"); 
var formData = formElement.serializeArray(); 

var objectData = {}; 

for(var i = 0; i < formData.length; i++) 
    objectData[formData[i].name] = formData[i].value; 

$.ajax({ 
    type: "POST", 
    async: true, 
    url: "/rest/user", 
    dataType: "text", 
    cache : false, 
    contentType : "application/json", 
    data: objectData, 
    success: function(result){ 
     consoloe.log(result) 
    }, 
    error: function(jqXHR, status, err) { 
     console.log(err) 
    } 
}); 

У меня есть ошибка!

jquery.js:4 POST http://127.0.0.1:3000/rest/user 400 (Bad Request) 

Отмеченный объект отладки objectData. Хорошо (Object {userFam: "qqq", userIm: "www", userOt: "eee", userEmail: "rrr", userLogin: "ttt"…}). Я не понимаю, что происходит.

+0

Вы пытались использовать [servant-js] (http://hackage.haskell.org/package/servant-js)? Он позволяет создавать функции на основе jQuery для запроса вашего сервиса. Даже если вы не хотите его использовать, вы можете сравнить JS-код, сгенерированный там с вашим. –

+0

IMO данные вашего объекта не выглядят правильно - см. Здесь https://stackoverflow.com/questions/4159701/jquery-posting-valid-json-in-request-body – Carsten

+0

вкратце вы можете попробовать это с помощью: dataType: json "', 'data: JSON.stringify (objectData)' (прямо сейчас вы используете '.toString()' на свой 'objectData', это часть, из которой происходит' Object', и это недопустимо JSON) – Carsten

ответ

2

это действительно проблема с ajax вызова, как вы не обеспечивают правильный объект JSON, но только objectData.toString() в data: - общее решение заключается в использовании JSON.stringify:

$.ajax({ 
    type: "POST", 
    async: true, 
    url: "/rest/user", 
    dataType: "json", 
    cache : false, 
    data: JSON.stringify(objectData), 
    success: function(result){ 
     // ... 
    }, 
    error: function(jqXHR, status, err) { 
     console.log(err) 
    } 
}); 

еще один замечательный пример того, что случилось с нетипизированные языки;)