Java以编程方式发送GraphQL REST查询

问题描述 投票:1回答:1

我是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格式,但这是用于桑格利亚汽酒的产品,因此不确定为什么它在这里不起作用。

play.api.http.HttpErrorHandlerExceptions $$ anon $ 1:执行例外[[JsResultException:JsResultException(errors:List((,List(ValidationError(List(“ query MyLearner {learner(id:1){ namedName}}“不是对象),WrappedArray())))))))]]]

]

从调试的JSON截屏中收到JSON正文:enter image description here

感谢@Ra Ka的指导,我能够提出正确的查询,请参见下面的答案:

{  
   "variables":{  
      "id":1
   },
   "operationName":"MyLearner",
   "query":"query MyLearner($id: Long!) {learner(id: $id) {misId givenName}}"
}
json scala playframework graphql
1个回答
3
投票

您提供的graphql查询格式错误。实际的graphql查询不是有效的JSON格式,因此您以该格式提供查询,因此,您肯定会获得无效的JSON异常。因此,您需要提供graphql查询作为值而不是正文。由于您的接收方法正在解析queryopertionNamevariables字段,因此您需要以以下格式提供请求正文:

{
    "variables": {
        "id": "123"
    },
    "operationName":"MyLearner",
    "query": "query MyLearner {learner($id: String) {lastName givenName} learners { givenName }}"
}

如果要了解有关查询的更多信息,例如变量和运算名称,请参考here

[此外,当我学习graphql时,我在理解operationName时遇到了麻烦,如果您知道它,请忽略它。 OperationName用于从query字段中已经存在的多个查询中进行选择。例如:

{
    "variables": {
        "id": "123"
    },
    "operationName":"Query1" or "Query2" //provide either of query to get data so that you can write single query for all data fetching and provide operationName for each type of data,
    "query": "query Query1 {learner($id: String) {lastName givenName} learners { givenName }} query Query2 {learner($id: String) learners { givenName }}"
    }
© www.soinside.com 2019 - 2024. All rights reserved.