Как установить ответ Json в учтивой веб-части

Я начинаю с Suave и F #.
Я пытаюсь передать сериализованный объект 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-ответ в моей веб-части, и с помощью приведенного выше кода я продолжаю получать сообщение об ошибке в моем типе выражений в моем let php

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)

Теперь, если вы хотите, вы можете заменить Json.toJson вызовите с помощью реализации Newtonsoft Json.NET или Chiron (но, надеюсь, не сочетая оба). Пока типы совпадают, у вас все будет хорошо.

В частности, для Хирона вам не хватает ToJson статический член типа, который вы хотите сериализовать (это то, что упоминается в вашем руководстве). Json.NET имеет универсальную функцию сериализации, которая генерирует json, соответствующий схеме записи, поэтому его проще использовать «из коробки», но также требуется больше работы для настройки вывода при необходимости.

4

Другие решения

Если вы хотите вернуть ответ HTTP 200 с JSON и установить заголовки HTTP в Suave, то вы можете использовать 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. Поэтому, если вы хотите сопоставить шаблон перед установкой заголовков, вы должны использовать что-то вроде:

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, этот фрагмент также может помочь.

3

По вопросам рекламы [email protected]