2017-10-27 10 views
0

Akka HTTP를 사용하여 Sangria의 Getting Started을 조금 변형했습니다. 나는 serializaltion lib로 json4s-jackson을 사용하려하지만, 내가 원하는 응답을 얻는데 어려움을 겪고있다.json4s 및 Akka HTTP를 사용하여 Sangria 응답을 어떻게 serialize 할 수 있습니까?

특히, 내가 얻을 직렬화 된 응답은 (StatusCode, Node) 튜플의 JSON 버전입니다 :

{ 
    "_1": { 
     "allowsEntity": true, 
     "defaultMessage": "OK", 
     "intValue": 200, 
     "reason": "OK" 
    }, 
    "_2": { 
     "data": { 
      "foo": { 
       "id": "1", 
       "name": "Foo" 
      } 
     } 
    } 
} 

data 부분이 올바른지,하지만 분명히 난 그냥 직렬화 된 튜플의 아닌 첫 번째 요소를 원한다. 내가 잘못 무엇을 알아낼 수 없습니다 내 인생

case class GraphQlData(query: String, operation: Option[String]) 

trait FooController { 
    import de.heikoseeberger.akkahttpjson4s.Json4sSupport._ 

    implicit val serialization = jackson.Serialization 
    implicit val formats = DefaultFormats 

    val fooRoutes = post { 
    entity(as[GraphQlData]) { data => 
     QueryParser.parse(data.query) match { 

     // query parsed successfully, time to execute it! 
     case Success(queryAst) => 
      complete { 
      Executor 
       .execute(
       SchemaDefinition.FooSchema, 
       queryAst, 
       new FooService, 
       operationName = data.operation 
      ) 
       .map(OK -> _) 
       .recover { 
       case error: QueryAnalysisError => BadRequest -> error.resolveError 
       case error: ErrorWithResolver => InternalServerError -> error.resolveError 
       } 
      } 

     // can't parse GraphQL query, return error 
     case Failure(error) => 
      complete(BadRequest -> error.getMessage) 
     } 
    } 
    } 

    implicit def executionContext: ExecutionContext 
} 

:처럼 나는 akka-http-json4s을 사용하고

, 그래서 경로 내 특성은 보인다. 나는 sangria-akka-http-example을보고 있었지만 json4s 대신 spray-json을 사용하는 것을 제외하고는 똑같은 것으로 보인다.

아이디어가 있으십니까? 감사!

답변

0

아, 알아 냈어. 나는 경로를 정의하는 특성에

import sangria.marshalling.json4s.jackson._

을 추가 무시. 그것은 트릭을 추가합니다.

0

전체 GraphQLRequest에 대한이 답변의 빠른 업데이트를 제공하고 싶습니다. 이제 변수가 요청에 포함됩니다.

import de.heikoseeberger.akkahttpjson4s.Json4sSupport 
import org.json4s._ 
import org.json4s.JsonAST.JObject 
import sangria.marshalling.json4s.jackson._ 

case class GQLRequest(query: String, operationName: Option[String], variables: JObject) 

trait SomeJsonSupport extends Json4sSupport { 
    implicit val serialization = jackson.Serialization 
    implicit val formats = DefaultFormats 

} 

trait GraphQLResource extends SomeJsonSupport{ 
    implicit val timeout:Timeout 
    implicit val system:ActorSystem 
    import system.dispatcher 

    def graphqlRoute: Route = 
    (post & path("graphql")) { 
     entity(as[GQLRequest]) { requestJson => 
     println(s"This is the requestJson = $requestJson") 
     graphQLEndpoint(requestJson) 
     } 
    } ~ 
     get { 
     println(s"This is working") 
     getFromResource("graphiql.html") 
     } 


    def graphQLEndpoint(requestJson: GQLRequest): Route = { 
    val route = QueryParser.parse(requestJson.query) match { 
     case Success(query) => 
     println(s"This is the query $query") 


     val vars = requestJson.variables match { 
      case jObj:JObject => jObj 
      case _ => JObject(List.empty) 
     } 

     val futureJValue = Executor.execute(clientSchema, 
      query, 
      NclhGqlRequest(this), 
      operationName = requestJson.operationName, 
      variables = vars) 

     val futureTupleStatusCodeJValue = futureJValue.map(OK -> _).recover { 
      case error: QueryAnalysisError => BadRequest -> error.resolveError 
      case error: ErrorWithResolver => InternalServerError -> error.resolveError 
     } 
     complete(futureTupleStatusCodeJValue) 

     case Failure(error) => 
     complete(BadRequest, error.getMessage) 
    } 
    route 

    }