我是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())))))))]]]
]
感谢@Ra Ka的指导,我能够提出正确的查询,请参见下面的答案:
{
"variables":{
"id":1
},
"operationName":"MyLearner",
"query":"query MyLearner($id: Long!) {learner(id: $id) {misId givenName}}"
}
您提供的graphql查询格式错误。实际的graphql
查询不是有效的JSON
格式,因此您以该格式提供查询,因此,您肯定会获得无效的JSON异常。因此,您需要提供graphql
查询作为值而不是正文。由于您的接收方法正在解析query
,opertionName
和variables
字段,因此您需要以以下格式提供请求正文:
{
"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 }}"
}