在 Servant 中使用 ajax
Using ajax in Servant
我用Haskell和servant-0.7.1
实现server.Below是我的源代码:
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": "mail@mail.ru", "userLogin": "test", "userPswd": "test"}' \
http://127.0.0.1:3000/rest/user
一切正常。当我从后端使用 ajax
时添加到 database.But 的数据,如下所示。
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"…}
)。
我不明白发生了什么。
您的 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)
}
});
另一个很好的例子,无类型语言有什么问题 ;)
我用Haskell和servant-0.7.1
实现server.Below是我的源代码:
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": "mail@mail.ru", "userLogin": "test", "userPswd": "test"}' \
http://127.0.0.1:3000/rest/user
一切正常。当我从后端使用 ajax
时添加到 database.But 的数据,如下所示。
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"…}
)。
我不明白发生了什么。
您的 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)
}
});
另一个很好的例子,无类型语言有什么问题 ;)