2017-02-02 7 views
3

Suave 및 F #으로 시작하겠습니다. json 직렬화 된 객체를 내 웹 파트에 전달하여 내 응답으로 가져 오려고합니다. PHP에서suave webpart에서 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 개체를 얻을이 함께하고 난 유쾌한와 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 개체를 serialize하지만 내 웹 파트에서 http 응답으로 전달하는 위의 코드와 함께 전달하는 방법을 모르겠다. PHP에서 내 표현 유형에 오류가 계속 발생한다.

+0

어떤 오류가 발생합니까? 'Json.format'이 어떤 타입인지 또는 어디에서 가져 왔는지 모르겠지만'OK'에 문자열을 전달해야합니다. – scrwtp

+0

사실,'Choice1Of2' 케이스에있는 코드는 생각할 수있는'Json.serialize/format'의 정상적인 구현에 대해 대단히 보입니다. – scrwtp

+0

'영화'란 무엇입니까? 그것은 어디에도 정의되어 있지 않습니다. – TheInnerLight

답변

3

당신이 너무 많은 몇 JSON 직렬화 라이브러리에서 가져온 것 같은데 - 당신은 ... 더 큰 효과 (자습서에 사용되는) Json.NET 및 카이론의 비트를 혼합하는 것

한 걸음 물러서십시오. 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 또는 (희망하지만 둘의 혼합) 카이론 구현 중 하나와 함께 Json.toJson 전화를 대체 할 수 있습니다. 유형이 정렬되어있는 한 괜찮을 것입니다.

특히 Chiron의 경우 serialize하려는 유형에 정적 멤버 ToJson이 누락되어 있습니다 (자습서에서는 언급하지 않습니다). Json.NET에는 레코드 스키마에 해당하는 json을 생성하는 serialize 함수가 있으므로 상자를 사용하기가 약간 쉬울뿐 아니라 필요한 경우 출력을 사용자 정의하는 데 많은 작업이 필요합니다.

+0

고맙습니다. 이제 작동합니다. – user3525616

2

모든 것은 당신이 다음 다른 웹 파트가를 사용하여 구성 할 수있는 WebPart을 구성하는 식이다

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) 

: JSON과 HTTP 200 응답을 설정하고 유쾌한에서 HTTP 헤더를 설정 한 다음 당신은 Writers.setHeader 기능을 사용할 수 있습니다 함수 Suave가 제공합니다. 당신이 this snippet might also help을 CORS 헤더를 설정하는 것처럼

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) 

: 당신이 헤더를 설정하기 전에 패턴 일치를 원한다면 그래서, 당신은 같은 것을 사용하십시오.

+0

예, 이제 json 데이터를 받고 있지만 "{\"player1Key \ ": \"BadBoys2 \ ", \"gameKey \ ": \"zLUGgtrht4456 \ "}" 그리고 나는 백 슬래시를 원하지 않습니다. 어떤 아이디어? – user3525616

+0

'Writers.setHeader "Content-Type" "application/json; charset = UTF-8"은 올바른 헤더입니다. – Monsignor