我从 Suave 和 F# 开始。 我正在尝试在我的 Web 部件中传递一个 json 序列化对象以在我的响应中获取它。
在 php 中我有这个
<?php
header('Access-Control-Allow-Credentials:true');
header('Access-Control-Allow-Headers:Content-Type, Accept');
header('Access-Control-Allow-Methods:GET, POST, PUT, DELETE, OPTIONS');
header('Access-Control-Allow-Origin:*');
?>
{
"player1Key":"hdegftzj25",
"gameKey":"aegfhzkfszl74852"
}
有了这个我得到了我的 json 对象,然后我尝试用 Suave 和 Newtonsoft.Json 做同样的事情
type gameCreate= {
player1Key : string
gameKey: string
}
let create= { player1Key = "BadBoys2"; gameKey = "zLUGgtrht4456" }
let json = Newtonsoft.Json.JsonConvert.SerializeObject(create)
//OK (acc |> Json.serialize |> Json.format )
let php =
request (fun r ->
match r.queryParam "playerName" with
| Choice1Of2 name -> OK (movies |> Json.serialize(json) |> Json.format(json))
//|> Response.response(Json.toJson(info))
//|> OK
| Choice2Of2 msg -> BAD_REQUEST msg)
let webPart =
choose [
path "/" >=> (OK "Home")
path "/elm/api/create.php" >=> php
]
startWebServer defaultConfig webPart
所以我可以创建和序列化一个 json 对象,但我不知道如何将它作为 http 响应传递到我的 web 部件中,并且使用上面的代码我在 let php 中的表达式类型上不断出现错误
最佳答案
看起来你引入了太多的 Json 序列化库 - 你似乎混合了 Json.NET 和 Chiron(教程中使用的)的一些部分,但效果不佳......
让我们退一步。 Suave 带有它自己的 Json 序列化模块,所以你可以通过使用它来获得一些东西。这是它的样子:
let php =
request (fun r ->
match r.queryParam "playerName" with
| Choice1Of2 name ->
let json : string =
create
// this comes from Suave.Json, gives you a byte array
|> Json.toJson
// converts the byte array into a string
|> System.Text.Encoding.UTF8.GetString
OK json
| Choice2Of2 msg -> BAD_REQUEST msg)
现在,如果需要,您可以将 Json.toJson
调用替换为 Newtonsoft Json.NET 或 Chiron 实现(但希望不要混合使用两者)。只要类型对齐,就应该没问题。
特别是对于 Chiron,您在要序列化的类型上缺少 ToJson
静态成员(这是您的教程确实提到的内容)。 Json.NET 具有生成对应于记录模式的 json 的通用序列化函数,因此开箱即用更容易一些,但如果需要,还需要做更多工作来自定义输出。
关于php - 如何在 suave webpart 中设置 Json 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42013940/