【发布时间】:2017-10-29 11:36:14
【问题描述】:
我是 GraphQL 的新手,我正在尝试弄清楚如何以编程方式发送我在单独的微服务中实现的 GraphQL POST 查询。
在我的主应用程序中,我使用 Java + Spring REST 模板发送查询,同时将 POST 正文附加为字符串 GraphQL 查询,例如
String body = "query MyLearner {learner(id: 1) {lastName givenName} learners { givenName }}";
我可以在我的 play-scala 微服务中接收查询,但无法解析 JSON。
接收方式:
def graphqlBody(tenant: Int) = Action.async(parse.json) { request ⇒
val query = (request.body \ "query").as[String]
val operation = (request.body \ "operationName").asOpt[String]
val variables = (request.body \ "variables").toOption.flatMap {
case JsString(vars) ⇒ Some(parseVariables(vars))
case obj: JsObject ⇒ Some(obj)
case _ ⇒ None
}
executeQuery(query, variables, operation)
}
注意,我基本上尝试使用我的域模型来实现 GraphQL Sangria 代码,因此它可能看起来与人相似。 sangria
我在解析 JSON 时在该方法的第 1 行遇到错误我假设这是因为传入的 JSON 主体不是有效的 JSON,因为它是 GraphQL 格式,但这是用于 Sangria 并且适用于 Sangria 所以不是确定为什么它在这里不起作用。
play.api.http.HttpErrorHandlerExceptions$$anon$1: 执行异常[[JsResultException: JsResultException(errors:List((,List(ValidationError(List("query MyLearner {learner(id: 1) {lastName givenName}) { givenName }}" 不是对象),WrappedArray())))))]]
感谢@Ra Ka 的指导,我能够提出正确的查询,请参阅下面的答案:
{
"variables":{
"id":1
},
"operationName":"MyLearner",
"query":"query MyLearner($id: Long!) {learner(id: $id) {misId givenName}}"
}
【问题讨论】:
-
该方法收到的请求正文是什么?正如你所说,似乎播放无法解码你的 json
-
我已经用 JSON 正文的屏幕截图更新了问题。
标签: json scala playframework graphql