2017-10-27 9 views
0

Akka HTTPを使用して、SangriaのGetting Startedを少し修正しています。私は、serializaltionのlibとしてjson4s-jacksonを使用しようとしていますが、私が望む応答を得るためにいくつかの問題に走っています。json4sとAkka HTTPでSangriaの応答をシリアル化するにはどうすればよいですか?

具体的には、私が手にシリアライズされた応答が(StatusCode, Node)タプルのJSONバージョンです:

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

data部分は正しいですが、明らかに私はちょうどそれではなくシリアル化されたタプルの最初の要素をしたいです。

私はakka-http-json4sを使用していますので、ルートと私の形質は次のようになります。

私の人生のために
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 
} 

私が間違っているかを把握することはできません。私は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 

    } 
関連する問題