如何在suave webpart中设置Json响应

时间:2017-02-02 22:59:49

标签: php json http f# suave

我开始用Suave和F#开头。 我试图在我的webpart中传递一个json序列化对象来获取它。

在php中我有这个

[(ngModel)]="registerAccount.authorities" to

并且我得到了我的json对象,然后我尝试用Suave和Newtonsoft.Json做同样的事情

<?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对象,但我不知道如何在我的web部分中将其作为http响应传递,并且使用上面的代码我继续在我的let php <我的表达式中输入错误< / p>

2 个答案:

答案 0 :(得分:4)

看起来你已经引入了一些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)

现在,如果需要,可以用Newtonsoft Json.NET或Chiron实现替换Json.toJson调用(但希望不是两者的混合)。只要类型对齐,你应该没问题。

特别是对于Chiron,您错过了要序列化的类型上的ToJson静态成员(这是您的教程提到的内容)。 Json.NET有一个通用的序列化函数,可以生成与记录模式相对应的json,因此开箱即可使用起来更容易一些,但如果需要,还需要更多工作来自定义输出。

答案 1 :(得分:3)

如果要使用JSON返回HTTP 200响应并在Suave中设置HTTP标头,则可以使用Writers.setHeader函数:

Writers.setHeader "Access-Control-Allow-Credentials" "true" >=>
Writers.setHeader "Access-Control-Allow-Headers:Content-Type" "Accept" >=>
Writers.setHeader "Access-Control-Allow-Methods" "GET, POST, PUT, DELETE, OPTIONS" >=>
Writers.setHeader "Access-Control-Allow-Origin" "" >=>
Successful.OK (movies |> Json.serialize |> Json.format)

整个事情是一个构造WebPart的表达式,然后您可以使用Suave提供的函数与其他Web部件组合。因此,如果您想在设置标题之前进行模式匹配,则可以使用以下内容:

let php = request (fun r ->
  match r.queryParam "playerName" with
  | Choice1Of2 name ->  
      Writers.setHeader "Access-Control-Allow-Credentials" "true" >=>
      Writers.setHeader "Access-Control-Allow-Headers:Content-Type" "Accept" >=>
      Writers.setHeader 
        "Access-Control-Allow-Methods" "GET, POST, PUT, DELETE, OPTIONS" >=>
      Writers.setHeader "Access-Control-Allow-Origin" "" >=>
      Successful.OK (movies |> Json.serialize |> Json.format)
  | Choice2Of2 msg -> BAD_REQUEST msg)

在设置CORS标头时,this snippet might also help