Использование ajax в Servant

Я использую Haskell с сервером реализации servant-0.7.1 fo. Ниже приведен мой исходный код:

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)

Для теста был использован 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"…}). Я не могу понять, что происходит.


person QSpider    schedule 20.05.2016    source источник
comment
Вы пробовали использовать servant-js? Он позволяет создавать функции на основе jQuery для запросов к вашей службе. Даже если вы не хотите его использовать, вы можете сравнить сгенерированный там код JS со своим.   -  person Alp Mestanogullari    schedule 20.05.2016
comment
IMO данные вашего объекта выглядят неправильно - см. здесь тело запроса"> stackoverflow.com/questions/4159701/   -  person Random Dev    schedule 20.05.2016
comment
короче, вы можете попробовать это с: dataType: "json", data: JSON.stringify(objectData) (прямо сейчас вы используете .toString() на своем objectData, откуда берется часть Object, и это недействительный JSON)   -  person Random Dev    schedule 20.05.2016
comment
Я пробовал JSON.stringify(objectData). Теперь это работает!!! Большое спасибо за идею с JSON.stringif.   -  person QSpider    schedule 20.05.2016
comment
Я добавлю это как ответ, надеюсь, вы не возражаете   -  person Random Dev    schedule 20.05.2016


Ответы (1)


это действительно проблема с вашим вызовом 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)
    }
});

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

person Random Dev    schedule 20.05.2016