Я начинаю с 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
Похоже, вы слишком много используете библиотек сериализации 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, соответствующий схеме записи, поэтому его проще использовать «из коробки», но также требуется больше работы для настройки вывода при необходимости.
Если вы хотите вернуть ответ 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, этот фрагмент также может помочь.