2017-05-29 16 views
1

私はGraphQLを初めて使い、別のマイクロサービスで実装したGraphQL POSTクエリをプログラマチックに送信する方法を理解しようとしています。JavaプログラムによるGraphQL RESTクエリの送信

私の主なアプリケーションでは、POST BodyをString GraphQLクエリとして添付している間に、Java + Spring REST Templateを使用してクエリを送信しています。

String body = "query MyLearner {learner(id: 1) {lastName givenName} learners { givenName }}"; 

私は自分のプレイScalaのマイクロサービスでクエリを受け取ることができますが、JSONを解析することはできません。私は基本的には人のようになりますので、自分のドメインモデルとGraphQLサングリアコードを実装しようとした

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) 
} 

注:メソッドを受信

sangria

JSONの解析中にメソッドの1行目にエラーが発生しましたが、JSON本体が有効なJSONでないと仮定しています。これはGraphQL形式ですが、これはSangriaなぜここではうまくいかないのか分かりません。

play.api.http.HttpErrorHandlerExceptions $$アノン$ 1:実行例外[[JsResultException:JsResultException(エラー:リスト((リスト(ValidationErrorを(リスト(「クエリMyLearner {学習者(ID:1){lastNameのgivenName属性}学習{givenName属性}}」)WrappedArray())))))]] JSONのデバッグから

スクリーンショットJSONボディ受信されたオブジェクトではない:@Raカガイダンスにenter image description here

ありがとう私は正しい質問を出すことができました。答えは下記をご覧ください。

{ 
    "variables":{ 
     "id":1 
    }, 
    "operationName":"MyLearner", 
    "query":"query MyLearner($id: Long!) {learner(id: $id) {misId givenName}}" 
} 
+0

メソッドが受け取るリクエストの本文は何ですか?あなたが言ったように、あなたのjsonを解読できないような演劇のようだ。 – vdebergue

+0

私はJSON Bodyのスクリーンショットで質問を更新しました。 – Schokea

答えて

3

間違った形式でgraphqlクエリを提供しています。実際のgraphqlクエリは有効なJSONフォーマットではなく、そのフォーマットで提供しているため、間違ったJSON例外が発生します。したがって、本文の代わりにgraphqlクエリを値として提供する必要があります。あなたの受信方法はqueryopertionNamevariablesフィールドを解析しているとして、あなたは次の形式でリクエストボディを提供する必要があります:あなたは、このようなhere

参照してください。変数とのoperationNameとしてクエリについての詳細を知りたい場合は

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

また、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 }}" 
    } 
+0

ありがとう私は私が従っていたチュートリアルからこれを明確にすることができませんでした。とても有難い! – Schokea

+0

ちょっと@Ra Kaあなたの答えにはいくつかの小さな誤りがありますが、私はそれらを理解することができました。あなたがあなたのクレジットの大半を受けるにふさわしいようにあなたの答えを私のものと似たものに更新したいのであれば、私の投稿を回答で更新してください。 – Schokea

+0

@Schokeaそれはあなたのために働いてうれしい! :) –

関連する問題