ColdFusion の GraphQL

ColdFusion の GraphQL について、REST、GraphQL スキーマ、変数、およびパラメーターとの違いについて説明します。

GraphQL とは何か?

GraphQL は、API データに必要なすべての情報を提供し、クライアントが必要な情報を正確にリクエストできるようにします。

GraphQL API の利点には、次のようなものがあります。

  • 一度に複数のデータソースをクエリすることができます。
  • 必要なデータのみを取得します。
  • データの変更や追加を容易に行えます。

GraphQL と REST との違い

REST は web サービスを作成するアーキテクチャスタイルですが、GraphQL は API のクエリ言語です。 

GraphQL は、特定のデータをクエリし、必要なデータのみを取得できるので、REST より格段に優れています。REST ベースの API とは異なり、GraphQL はデータの戻り値をカスタマイズできるようにします。また、クエリ構造が返される JSON の構造に似ています。

GraphQL をいつ使用するか?

アンダーフェッチとオーバーフェッチ
ユーザーの帯域幅が制限されていることがわかっている場合は、GraphQL を使用して、複数のリクエストを行わずに、必要なデータを正確にリクエストできます。

データ転送の最適化
クライアント負荷が高いアプリケーションを使用しており、クライアントとサーバー間のデータ転送を最適化する必要がある場合に、GraphQL を使用できます。

消費帯域幅の減少
GraphQL は、単一の API 呼び出しを行って正確なデータを取得するので、消費する帯域幅が少なくなります。そのため、帯域幅を最適化したい場合に使用できます。これは、ソーシャルメディア、メッセージング、SMS ベースのプログラムなど、非常に大きな冗長アプリケーションを扱う場合に役立ちます。

基本コンセプト

GraphQL リクエスト文字列は、GraphQL ドキュメントと呼ばれます。次に例を示します。

{
  author {
    id
    name
  }
}

GraphQL クエリをページに読み込んでクエリとして使用するか、コード内にクエリをインラインで記述することで、GraphQL クエリを利用できます。

GraphQL クライアントメソッド

GetGraphQLClient

シンタックス

getGraphQLClient(parameterStruct) 

説明

このメソッドを使用して、スキーマを含むサーバーと通信する GraphQL クライアントを作成します。設定パラメーターを渡して、クライアントを取得します。

パラメーター

パラメーター 説明 必須
service_url スキーマを含むサーバーの URL。独自のサーバーを作成することも、既存のサーバーを使用することもできます。詳細については、次の資料を参照してください。 はい
service_name
サーバーの名前を指定します。
はい
client_name ColdFusion Administrator で設定した GraphQL クライアントの名前。ColdFusion Administrator で GraphQL サービスを設定する方法について詳しくは、GraphQL オプションを参照してください。 はい
raw_http_client 
(True/False)内部的に HTTP クライアントまたは Apollo クライアントを使用する必要があるかどうかを指定する属性。
いいえ
root_package_name
サーバーのルートを指定します。例えば、サーバーが 2 台ある場合は、cfusion/gql/main/src に両方のフォルダーを作成し、pom.xml でそのフォルダーを参照します。ルートフォルダーは、GraphQL サービスごとに一意である必要があります。
いいえ
headers

次の内容を含む構造体。

  • キー:サーバーで認証するキー。
  • 値:サーバーで認証する値。
はい
batching_configuration 

GraphQL クライアントでは、1 つの HTTP 呼び出しで複数の操作を実行できるようにすることで、ネットワークの往復回数を削減するために、バッチ処理が必要とされています。

パラメーターは、次の構造体です。

  • enabled:(True/False)バッチ処理が有効になっているかどうかを示します。
  • batch_interval_ms:各呼び出し間の間隔(ミリ秒単位)。
  • max_batch_size:バッチで送信される呼び出し数を指定します。

バッチ処理が必要な場合は、「有効」にする必要があります。残りはオプションです。

いいえ
Subscription_configuration 
次のような構造体。
  • websocket_url:サブスクリプションの場合は、WebSocket を通じて通信が実行されるので、URL を指定します。WebSocket URL はサーバー URL とは異なる場合があります。
  • subscription_heartbeat_timeout:サブスクリプションのタイムアウト値を指定します。
  • subscription_heartbeat_timeunit:タイムアウトの単位を指定します。

サブスクリプションが必要な場合は、websocket_url が必要です。

いいえ

例外

例外 説明
ValidationException
設定が null または正しくない場合。
ModuleNotAvailableException
GraphQLClient モジュールがインストールされていない場合。

次に例を示します。

inline

// GQL オブジェクトの作成 
gqlClient = getGraphQLClient({ 
    service_url : "ENDPOINTURL", 
    "raw_http_client" : true 
}); 
// この変数は GQL クエリを保持 
Gql = ‘ 
query  
    { 
        Table  
            {  
                Column1  
                Column2 
                Column3 
                Column4 
            } 
        } 
‘ 
// クエリからの応答を変数に割り当てて、画面にダンプできるようにする 
response = gqlClient.fetchResponse(gql1, {}); 

ファイル

gqlClient = getGraphQLClient ({ 
  service_name: "server-name", 
  type = "graphqlclient", 
  "raw_http_client": true, 
  service_url : "endpoint-url", 
  root_folder: "root_folder", 
  headers : { 
      values: "auth-value", 
      keys: "auth-key" 
  }, 
batching_configuration: { 
    		enabled: true, 
    		batch_interval_ms: 10, 
    		max_batch_size: 15 
}, 
subscription_configuration : { 
   		websocket_url: "wss://websocket-url", 
    		subscription_heartbeat_timeout : 5, 
    		subscription_heartbeat_timeunit : "nano" 
} 
}) 

GenerateGraphQLModels

シンタックス

generateGraphQLModels() 

説明

このメソッドでは、すべてのクエリ、ミューテーション、およびサブスクリプションのモデルが生成されます。クエリー変更がある場合、または graphql ファイルに新しいクエリを追加した場合は、毎回このメソッドを呼び出します。

エラーが発生した場合は、ColdFusion を停止し、Felix キャッシュ( CFHOME\cfusion\bin\felix-cache)をクリアして、ColdFusion を再起動します。

GraphQL オブジェクトのメソッド

GraphQL オブジェクトには、fetchResponse というメソッドが含まれています。このメソッドは、指定されたクエリのサーバーへの応答を取得します。

シンタックス 

fetchResponse(query, queryParams) 

パラメーター 

  • query:サーバーに渡されるクエリ、サブスクリプション、またはミューテーション。
  • queryParams:クエリパラメーターとして渡す値。

例外

  • org.apache.maven.shared.invoker.MavenInvocationException

次に例を示します。

paramValues = ${id:[89,109,189,200,205]};

response = gqlclient.fetchResponse("mutation BookTrip($id:[ID]!){bookTrips(launchIds:$id) {success message}}", paramValues);

GraphQL クライアントメソッド

サポートされているメソッドは次のとおりです。

メソッド パラメーター 戻り値
activeCallsCount() 
なし クエリに対して実行された呼び出しの数

addOnSubscriptionManagerStateChangeListener

(com.apollographql.apollo.subscription.OnSubscriptionManagerStateChangeListener) 

クロージャ関数 なし
disableSubscriptions() 
なし なし
downloadSchema(java.lang.String, java.lang.String) 
クエリのスキーマ なし
enableSubscriptions() 
なし なし
getApplicationInterceptorFactories() 
なし リスト
getApplicationInterceptors() 
なし リスト
getName() 
なし クエリ名
getSchema(java.lang.String) 
なし GraphQL スキーマを返します
getServerUrl() 
なし GraphQL サーバーの URL
getSubscriptionManager() 
なし サブスクリプションマネージャー
getSubscriptionManagerState() 
なし サブスクリプションマネージャーの状態。
mutation(java.lang.String, java.lang.Object) 
  1. ミューテーションの名前
  2. 追加するデータを含む構造体
ミューテーションオブジェクト
query(java.lang.String, java.lang.Object) 
  1. スキーマ
  2. クエリに対するデータの構造
クエリオブジェクト
serverOk() 
なし サーバーの状態、サーバーが稼働している場合は True、それ以外の場合は False
shutDown() 
なし なし
startBatchPoller() Non
なし なし
stopBatchPoller() 
なし なし
subscribe(java.lang.String, java.lang.Object) 
  1. スキーマ
  2. サブスクリプションの構造体データ
なし

Query/Mutation/Subscription object  

操作のオブジェクトを取得するには、getGraphQLClient という関数のオブジェクトを作成します。

// 最初に graphQL サービスを取得
     gqlClient = getGraphQLClient({ 
      service_Url : "https://apollo-fullstack-tutorial.herokuapp.com/graphql", 
      root_folder: "root", 
  //"raw_http_client": true, 
  headers: { 
    		  keys: "key", 
    		  values: "value"     	  } 

    }); 
    generateGraphQLModels();     
    queryObj = gqlClient.query(schema,values)

クエリオブジェクトのメソッド

サポートされているメソッドは次のとおりです:

メソッド パラメーター 戻り値
canBeBatched(boolean) 
boolean 
クエリオブジェクトを返します。
cancel() 
なし なし
clone() 
なし 操作の複製オブジェクトを返します。
Enqueue(closure) 
()、execute () は queryObject メソッドで使用できます。これらは、queryObject.execute() または mutationObject.enqueue(onSuccess, onFailure) で呼び出されます。enqueue() でのクロージャは 2 つあり、1 つは成功、もう 1 つは失敗です。
なし
execute() 
なし クエリオブジェクトからの結果を返します。
fields() 
なし クエリ応答のフィールドを返します。
isCanceled() 
なし 操作がキャンセルされた場合(True)、キャンセルされなかった場合 (False)を返します。
marshalVariablesJson() 
なし JSON データを返します。
opName() 
なし クエリ、ミューテーション、サブスクリプション操作の名前を返します。
operation() 
なし 操作の種類を返します。
rawOperation() 
なし 文字列を返します。
toBuilder() 
なし ApolloCall.Builder<T> オブジェクトを返します。
variables() 
なし 操作で使用する変数の構造体を返します。

ミューテーションオブジェクトのメソッド

サポートされているメソッドは次のとおりです:

メソッド パラメーター 戻り値
canBeBatched(boolean)
注意:ミューテーションはバッチ処理ではサポートされていません。
ブール値 クエリオブジェクトを返します。
cancel() 
なし なし
clone() 
なし 操作の複製オブジェクトを返します。
Enqueue(closure) 
クエリ操作のロジックを処理するコールバック。例えば、OnResponse、OnFailure、OnHTTPError など。
なし
execute() 
なし
クエリオブジェクトからの結果を返します。
fields() 
なし
クエリ応答のフィールドを返します。
isCanceled() 
なし
操作がキャンセルされた場合(True)、キャンセルされなかった場合 (False)を返します。
marshalVariablesJson() 
なし
JSON データを返します。
opName() 
なし
クエリ、ミューテーション、サブスクリプション操作の名前を返します。
operation() 
なし
操作の種類を返します。
rawOperation() 
なし
文字列を返します。
toBuilder() 
なし
ApolloCall.Builder<T> オブジェクトを返します。
variables() 
なし
操作で使用する変数の構造体を返します。

サブスクリプションオブジェクトのメソッド

サポートされているメソッドは次のとおりです:

メソッド パラメーター 戻り値
cancel() 
なし なし
clone() 
なし 操作の複製オブジェクトを返します。
Execute(closure,closure,closure) 
クエリ操作のロジックを処理するコールバック。例えば、 OnResponse、OnFailure、OnHTTPError など。
なし
execute(Closure onConnected, Closure onResponse, subscriptionObject.closure onFailure,Closure onCompleted, Closure onTerminated) 
クエリ操作のロジックを処理するコールバック。例えば、 OnResponse、OnFailure、OnHTTPError など。
 
isCanceled() 
なし 操作がキャンセルされた場合(True)、キャンセルされなかった場合 (False)を返します。

GraphQL クライアントの設定

ColdFusion Administrator

ColdFusion Administrator を使用して GraphQL サービスを設定します。詳しくは、GraphQL オプションを参照してください。

<cfscript>
	adminObj = CreateObject(&quot;component&quot;,&quot;CFIDE.adminapi.administrator&quot;);
	adminObj.login(&quot;admin&quot;,&quot;admin&quot;)
	
	gqlCFC = CreateObject(&quot;component&quot;,&quot;CFIDE.adminapi.graphql&quot;)
	
	http_header = {
		&quot;x-hasura-admin-secret&quot; = &quot;secret&quot;
	}
	    gqlCFC.setServiceConfiguration(service_name=&quot;hasura&quot;,root_package_name=&quot;root_hasura&quot;,service_url=&quot;https://hardy-mink-39.hasura.app/v1/graphql&quot;,headers=http_header, schema_path=&quot;&quot;);
	sc = {
        websocket_url: &quot;wss://hardy-mink-39.hasura.app/v1/graphql&quot;,
        subscription_heartbeat_timeout : &quot;1&quot;,
        subscription_heartbeat_timeunit : &quot;days&quot;
    }
    bc = {
        enabled: false
    }
	gqlCFC.setClientConfiguration(client_name=&quot;hasura_client_http&quot;,service_cname=&quot;hasura&quot;,raw_http_client=true,batching_configuration=bc, subscription_configuration=sc);
	gqlCFC.updateServiceConfiguration(service_name=&quot;hasura&quot;,raw_http_client=true, root_package_name=&quot;updated_root&quot;);
	gqlCFC.updateClientConfiguration(client_name=&quot;hasura_client_http&quot;,raw_http_client=false);
	gqlFC.deleteServiceConfiguration(&quot;hasura&quot;); Deleting service will delte clients as well
	gqlFC.deleteClientConfiguration(&quot;hasura_client_http&quot;);
	
</cfscript>

GraphQL スキーマとは何か?

使用する GraphQL API エンドポイントの機能は、スキーマによって制限されます。スキーマは、GraphQL エンドポイントで許可される内容を JSON で記述したものです。

スキーマは、クエリの表現として参照される項目についての説明です。GraphQL サーバーの実装は、GraphQL スキーマを中心に構築されます。GraphQL サーバの機能(クエリ、変更、サブスクリプションの範囲、使用できる追加の型やディレクティブなど)の概要を説明します。 

バックエンドのデータストレージから入力されたフィールドを含む型の階層は、スキーマによって定義されます。また、クライアントがサーバーにアクセス、書き込み、削除できるデータについても説明します。

スキーマの基本的な概念

GraphQL スキーマ GraphQL SDL(スキーマ定義言語)を作成します。これは、GraphQL スキーマ言語とも呼ばれます。

スキーマは、型のコレクションとそれらの間の関係を定義します。GraphQL には 4 つの基本的な型があります。

  • スカラー
  • オブジェクト - クエリ、ミューテーション、サブスクリプション
  • 入力
  • 列挙

GraphQL スキーマの記述

スキーマを記述する前に、以下のものを準備してください。

  • 構造とフィールド
  • フィールドの型と戻り値の型
  • 操作の種類、クエリ、ミューテーション、またはその両方

次の例では、Person という単純な型を、スキーマを使用して定義します。

type Person {
  name: String! age: Int! }

このスキーマには、「name」および「age」の 2 つのフィールドがあり、データ型はそれぞれ String と Int です。

また、Person も Post の一部になることができます。

type Post {
  title: String! author: Person! }

詳しくは、GraphQL スキーマを参照してください。

GraphQL の操作 

次に、GraphQL 操作の種類を示します。

  • クエリ(読み取り専用のフェッチ)
  • ミューテーション(書き込みの後にフェッチ)
  • サブスクリプション(イベントに応答して、データをフェッチするリクエスト)

クエリ

GraphQL クエリは、REST GET 呼び出しのようにアプリケーションサーバーからデータを取得します。GraphQL クエリは、次のような幅広いユースケースに対応しています。

  • 表示される一連の製品。
  • 顧客データの表示。 
  • 買い物かごの内容。

クエリの構造

クエリには、次の要素が含まれています。

  • オプションのキーワードクエリ。 
  • ローカル実装の操作名。変数が含まれている場合は、この名前が必須です。
  • クエリ名。
  • 検索対象となる用語。 
  • クエリが返すデータを指定する出力オブジェクト。

次の例は、買い物かごクエリの構造を示しています。

query myCartQuery{
  cart(cart_id: String!): Cart
}

上の例の MyCartQuery は、買い物かごクエリの実装方法を示しています。null 非許容値の買い物かご ID を含む文字列は、クエリする買い物かごを識別します。感嘆符で表示されているように、値に null 値を指定することはできません。返されるフィールドは、買い物かご出力オブジェクトによって指定されます。

クエリ全体を次に示します。

query myCartQuery{ 
  cart(cart_id: &quot;1WxKm8WUm3uFKXLlHXezew5WREfVRPAn&quot;) { 
    items { 
      id 
      quantity 
    } 
    billing_address { 
      firstname 
      lastname 
      postcode 
      } 
    shipping_addresses { 
      firstname 
      lastname 
      postcode 
    } 
  } 
} 

次の例は、クエリ応答を示しています。

{ 
  &quot;data&quot;: { 
    &quot;cart&quot;: { 
      &quot;items&quot;: [ 
        { 
          &quot;id&quot;: &quot;7&quot;, 
          &quot;quantity&quot;: 10 
        } 
      ], 
      &quot;billing_address&quot;: { 
        &quot;firstname&quot;: &quot;James&quot;, 
        &quot;lastname&quot;: &quot;Spencer&quot;, 
        &quot;postcode&quot;: &quot;12345&quot; 
      }, 
      &quot;shipping_addresses&quot;: [ 
        { 
          &quot;firstname&quot;: &quot;James&quot;, 
          &quot;lastname&quot;: &quot;Spencer&quot;, 
          &quot;postcode&quot;: &quot;12345&quot; 
        } 
      ] 
    } 
  } 
} 

クエリを定義する際は、次のことも実装できます。

非同期と同期

ColdFusion は、GraphQL での非同期操作をサポートしています。これにより、クライアントで操作を実行したり、同時スレッドで操作を実行したりできます。,

onSuccess = function(response) { 
writeOutput(&quot;Received Response from GraphQL Server&quot;); 
writedump(response.toString()); 
} 
onError = function() { 
writeOutput(&quot;Error While Receiving Response from GraphQL Server&quot;); 
}  
queryObj = gqlClient.query(&quot;Warriors&quot;, {});    
// async call 
queryObj.enqueue(onSuccess, onError);  
// sync call 
writedump(queryObj.execute()) 

非同期バージョンでは、クエリおよびミューテーション操作に対して、次のようなコールバックメソッドが用意されています。

  • onSuccess
  • onFailure

サーバーが成功した場合は、onSuccess コールバックが呼び出されます。それ以外の場合は、onFailure コールバックが呼び出されます。

GraphQL の変数

次の例に示すように、変数を渡します。

query ($limit: Int) { 
  author(limit: $limit) { 
    id 
    name 
  } 
} 

The variable can be set in the following way: 
{ 
  limit: 5 
} 

GraphQL の変数

GraphQL では、ミューテーションを含むデータの挿入、更新、または削除を行うことができます。ミューテーションとは、サーバー側でデータを変更できるようにする GraphQL の操作です。GraphQL のミューテーションは、REST における POST、PUT、PATCH、DELETE リクエストのようなものと考えることができます。

次に例を示します。

mutation { 

  addCategory(id: 6, name: &quot;Green Fruits&quot;, products: [8, 2, 3]) { 
    name 
    products { 
      name 
    } 
  } 
} 

サブスクリプション

サブスクリプションは、新規オブジェクトの作成や重要なフィールドの更新など、バックエンドデータの変更をクライアントにリアルタイムで通知するのに役立ちます。

次に例を示します。

type Subscription { 
  commentAdded(postID: ID!): Comment 
} 

On the client side, 
subscription OnCommentAdded($postID: ID!){ 
    commentAdded(postID: $postID) { 
      id 
      content 
    } 
  } 

サブスクリプションの仕組み

サブスクリプションは WebSocket を使用して、サーバーからクライアントへのリアルタイム通信を設定します。サブスクリプションは、クエリがサーバー上のデータを作成、読み取り、更新、または削除する際に WebSocket をリッスンします。イベントがサーバーからサブスクライビングしているクライアントにプッシュされます。

サポートされているコールバック関数は以下のとおりです。

  • public void execute(Closure onResponse, Closure onFailure, Closure onCompleted); 
  • public void execute(Closure onConnected, Closure onResponse, Closure onFailure,Closure onCompleted, Closure onTerminated)

次に例を示します。

<cfscript>  

    //Subscription Client Handle Creation 
    subscrClient = getGraphQLClient({ 
    		url = <graphql_server_url>, 
    	        webSocketServerUrl = <websocket_server_url>, 
    	        wsprotocol = <websocket_protocol>, 
    	        subscriptionTrasportFactory = <subscription_transport_factory>, 
    	        headers = <ok_http_client> 
    ... 
    }); 

    subscriptionHandlerCallback = <Callback to Handle the 	    OnCompleted/OnConnected/OnTerminated/OnResponse/OnFailure Logic for Subscription Operation>  
    subscriptionCall = subscrClient.subscribe(subscriptionObj);  
    subscriptionCall.execute(subscriptionHandlerCallback); 
 </cfscript> 

ColdFusion の GraphQL 

このリリースでは、ColdFusion のフルバージョンをインストールすると、GraphQL パッケージが自動的にインストールされます。

注意:

Graphql ファイルに名前を付ける場合、指定された操作の名前は、クエリ オブジェクトの形成時に指定された操作名と一致する必要があります。

GraphQL ファイルの場所

このドキュメントでは、例に Apollo サーバーを使用しています。

If {cfusion.home} is the location of ColdFusion home, then:

  • For service1, all .graphql files need to be placed in {cfusion.home}/src/main/graphql/service1 directory.
  • For service2, all .graphql files need to be placed in {cfusion.home}/src/main/graphql/service2 directory.
注意:

「myservice」は、graphqlclient パッケージにパッケージ化されているサービスです。「myservice」の xml エントリも pom.xml に一覧表示されます。独自のサービスを作成する場合は、同じディレクトリ(/cfusion/gql/src/main/graphql/{new_gql_service_name})にフォルダーを作成し、pom.xml ファイルを変更して新しいサービスを追加します。

pom.xml の変更点

pom.xml(ColdFusion/cfusion-home/gql)は、追加されたサービスエンドポイントエントリで上書きされます。

<myservice>
    <compilationUnit>
        <name>myservice</name>

        <compilerParams>
            <rootPackageName>root</rootPackageName>
        </compilerParams>
    </compilationUnit>

    <introspection>
        <enabled>true</enabled>

        <endpointUrl
            >https://apollo-fullstack
            tutorial.herokuapp.com/graphql</endpointUrl
        >

        <headers></headers>

        <connectTimeoutSeconds>10</connectTimeoutSeconds>
        <readTimeoutSeconds>10</readTimeoutSeconds>
        <writeTimeoutSeconds>10</writeTimeoutSeconds>
        <useSelfSignedCertificat>false</useSelfSignedCertificat>
        <useGzip>false</useGzip>
        <prettyPrint>false</prettyPrint>
    </introspection>
</myservice>

HTTP クライアントおよび Apollo クライアント

Apollo クライアントでは、クエリを記述して、作成したサービスフォルダーにクエリを配置できます。次に、cfm ファイルでメソッド generateGraphQLModels() を呼び出し、応答を生成します。

HTTP クライアントを使用すると、クエリをコンパイルせずにクエリを直接作成および編集できます。HTTP クライアントでは、サブスクリプションはサポートされていません。さらに、クライアント側でのパラメーターの型チェックは、HTTP クライアントでは実行されません。

クエリ 

クライアントは、クエリを使用して、必要なデータをサーバーにリクエストします。 

次に例を示します。

起動回数を計算します。

<cfscript> 
    // get the graphQL service first 
     gqlClient = getGraphQLClient({ 
      service_Url : &quot;https://apollo-fullstack-tutorial.herokuapp.com/graphql&quot;, 
      root_folder: &quot;root&quot;, 
  	  headers : { 
    		  keys: &quot;Authorization&quot;, 
    		  values: &quot;value&quot; 
    	  } 
    }); 
    generateGraphQLModels();	 
    queryObj = gqlClient.query(&quot;MissionDetails&quot;, {});	 
    response=queryObj.execute() 
    response.get(&quot;Data&quot;) 
</cfscript> 

同様に、予約された旅行の数を計算します。

<cfscript> 
    // 最初に graphQL サービスを取得
     gqlClient = getGraphQLClient({ 
      service_Url : &quot;https://apollo-fullstack-tutorial.herokuapp.com/graphql&quot;, 
      root_folder: &quot;root&quot;, 
 	  headers : { 
    		  keys: &quot;Authorization&quot;, 
    		  values: &quot;value&quot; 
    	  } 
    }); 
    generateGraphQLModels(); 
    queryObj = gqlClient.query(&quot;TripsBooked&quot;, {}); 
    //writedump(queryObj); 
    response=queryObj.execute() 
   // writeDump(response.get(&quot;Data&quot;)) 
</cfscript> 

出力

{totalTripsBooked=9} 

サブスクリプション

TripsBookedSub.graphql 

subscription TripsBookedSub { 
  tripsBooked 
} 

File.cfm 

<cfscript> 
    gqlClient = getGraphQLClient({ 
      service_Url : &quot;https://apollo-fullstack-tutorial.herokuapp.com/graphql&quot;, 
      root_folder: &quot;root&quot;, 
  	  headers : { 
    		  keys: &quot;Authorization&quot;, 
    		  values: &quot;value&quot; 
    	  } 
    }); 

    generateGraphQLModels();  
    queryObj=gqlClient.subscribe(&quot;TripsBookedSub&quot;,{}) 
    // writeDump(queryObj)     
</cfscript> 

ミューテーション

ミューテーションは、指定できるフェッチを返します。応答なしにミューテーションすることはできません。

ユーザーログインを追加します。

Login.graphql

mutation Login($email: String) { 
  login(email: $email) { 
    token 
  } 
} 

mutation.cfm 

<cfscript> 

    gqlClient = getGraphQLClient({ 
      service_Url : &quot;https://apollo-fullstack-tutorial.herokuapp.com/graphql&quot;, 
      root_folder: &quot;root&quot;, 
      //&quot;raw_http_client&quot;: true, 
      headers : { 
    		  keys: &quot;key&quot;, 
    		  values: &quot;value&quot; 
    	  } 
    }); 
    generateGraphQLModels(); 
    queryObj = gqlClient.mutation(&quot;Login&quot;, { 
                            &quot;email&quot;: &quot;user1@example.com&quot; 
    }); 

    // writedump(queryObj)   
    response=queryObj.execute() 
    // writeDump(response.get(&quot;Data&quot;)) 
</cfscript> 

出力

{

    login=Login{

        __typename=User, token=<token>

    }

}

フラグメント

フラグメントは再利用可能なクエリコンポーネントであり、GraphQL フラグメントです。GraphQL では、異なるクエリを使用して同じフィールドを検索する必要がある場合があります。クエリに複数の異なる場所に散在する繰り返しフィールドが多数含まれている場合は、それらを結合して、フラグメントと呼ばれる単一の再利用可能な単位にすることができます。

次の例は、任意の Employee オブジェクトでも使用できる EmpName フラグメントの宣言です。

fragment EmpName on Employee { 
  firstName 
  lastName 
} 

次に例を示します。

LaunchDetailsFragment.cfm

fragment launchFragment on Launch { 
  id 
  site 
  mission { 
    name 
  } 
} 
query LaunchDetailsFragment($id:ID!){ 
  launch(id: $id) { 
    # Usage of named fragment 
    ...launchFragment 
  } 
} 

Fragments.cfm 

<cfscript> 
    gqlClient = getGraphQLClient({ 
      service_Url : &quot;https://apollo-fullstack-tutorial.herokuapp.com/graphql&quot;, 
      root_folder: &quot;root&quot;, 
      headers : { 
    		  keys: &quot;key&quot;, 
    		  values: &quot;value&quot; 
    	  } 
    }); 
    generateGraphQLModels();  
    queryObj = gqlClient.query(&quot;LaunchDetailsFragment&quot;, {&quot;id&quot;: &quot;50&quot;}); 
    // writedump(queryObj) 
    response=queryObj.execute() 
    // writeDump(response.get(&quot;Data&quot;)) 
</cfscript> 

出力

{launch=Launch{__typename=Launch, fragments=Fragments{launchFragment=LaunchFragment{__typename=Launch, id=50, site=KSC LC 39A, mission=Mission{__typename=Mission, name=KoreaSat 5A}}}}} 

インラインパラメーター

GraphQL の ColdFusion 実装では、クエリとパラメーターを CFML コード内で直接インラインで渡すことができます。これにより、デバッグ時の読みやすさが向上するだけでなく、CF スコープからクエリパラメーターに変数を渡すことも容易になります。 

次に例を示します。

<cfscript> 
    // 最初に graphQL サービスを取得
    gqlClient = getGraphQLClient({ 
   service_Url : &quot; https://apollo-fullstack-tutorial.herokuapp.com/graphql &quot;, 
    &quot;raw_http_client&quot;: true, 
    headers : { 
        keys: &quot;key&quot;, 
 	values: &quot;value&quot; 
    } 
    }); 
    paramValues = ${launchId: 1}; // define the values to be passed in the query 
    response = gqlclient.fetchResponse(&quot; 
    query TripsBooked($launchId: ID!){ 
    launch(id: $launchId) { 
        id 
        isBooked 
        mission { 
          name 
    } 
  } 
}  
&quot;,paramValues); 
    writeOutput(response.get(&quot;Data&quot;)) 
</cfscript> 

出力

{"data":{"launch":{"id":"1","isBooked":false,"mission":{"name":"FalconSat"}}}}

ページネーション

GraphQL では、1 つのクエリでサーバーから必要なデータフィールドをすべて取得し、ネットワーク応答時間とペイロードサイズの点で不要なオーバーヘッドを排除します。ただし、特に予測できない長さの構造化データのリストを扱う場合には、このような機能強化が常に機能するという保証はありません。無制限の数の要素が含まれる可能性がある完全なリストを要求すると、ペイロードが非常に大きくなり、応答が遅れる可能性があります。これを解決するには、ページネーションを使用するか、リストを選択的にクエリします。

次に例を示します。

teacher { 

    name 

    students (first:5) { 

      name 

    } 

  } 

} 

引数のリミットとオフセットを使用して、一度に 1 ページずつ結果を表示します。

次に例を示します。

students (limit:5, afterID:152) { 

  id 

  name 

} 

バッチ処理

GraphQL クライアントでは、ネットワーク内の往復回数を減らすためにバッチ処理が必要でした。バッチ処理は、1 つの HTTP 呼び出しで複数の操作を有効にすることによって実行されます。

デフォルトでは、バッチ処理されたクライアントのすべての操作について、バッチ処理が有効になりますが、execute メソッドを呼び出す前に、canbeBatched(false) 操作を呼び出すことで操作をオプトアウトできます。

注意:

バッチ処理は、クエリ操作に対してのみ使用できます。

ColdFusion では、以下のバッチ処理パラメーターがサポートされています。

&quot;batching_configuration&quot;:{ 

            &quot;enabled&quot;: true, // クエリ、ミューテーション、サブスクリプションのバッチ処理を有効にするかどうか 

            &quot;batch_interval_ms&quot;: 1000, // 各呼び出し間の間隔(ミリ秒単位)
。&quot;max_batch_size&quot;: 2 //  

 } 

バッチ関数

次のバッチ関連関数がサポートされています。

startBatchPoller

説明

ポーリングメカニズムを開始して、キューに入れられたクエリを確認してバッチ化し、単一の HTTP 呼び出しとして送信します。この機能を使用するには、バッチ設定で「enabled」:true を有効にする必要があります。

シンタックス

gqlClient.startBatchPoller() 

次に例を示します。

<cfscript> 

    gqlClient = getGraphQLClient({ 

      service_Url : &quot;https://apollo-fullstack-tutorial.herokuapp.com/graphql&quot;, 

      root_folder: &quot;root&quot;, 

  //&quot;raw_http_client&quot;: true, 

  headers : { 

    		keys: &quot;Authorization&quot;, 

    		values: &quot;a2FsbHVAZ21haWwuY29t&quot; 

      }, 

      &quot;batching_configuration&quot;:{ 

            &quot;enabled&quot;: true, 

            &quot;batch_interval_ms&quot;: 1000, 

            &quot;max_batch_size&quot;: 2 

      } 

    }); 

    generateGraphQLModels();  

    writedump(gqlClient) 

    queryObj = gqlClient.query(&quot;TripsBooked&quot;, {}) 

    writedump(queryObj); 

    response=queryObj.execute() 

    writeDump(response.get(&quot;Data&quot;)) 

    

    // エラーおよび成功のクロージャ関数を定義 

     onSuccess = function(response) { 

        writeOutput(&quot;<br>Received Response from GraphQL Server----------<br>&quot;); 

        writeOutput(response.toString()); 

    } 

    onError = function() { 

        writeOutput(&quot;<br>Error While Receiving Response from GraphQL Server<br>&quot;); 

    } 

    writeOutput(&quot;<br/>&quot;& &quot;Active calls count&quot; & &quot;<br/>&quot;) 

    writeOutput(gqlClient.activeCallsCount()) 

    writeOutput(&quot;<br/>&quot;& &quot;Can be batched&quot; & &quot;<br/>&quot;) 

    gqlClient.startBatchPoller(); 

    queryObj.canBeBatched(true) 

</cfscript> 

stopBatchPoller

説明

ポーリングメカニズムを停止して、キューに入れられたクエリのバッチ処理を確認します。この機能を使用するには、バッチ設定で「enabled」:true を有効にする必要があります。

シンタックス

gqlClient.stopBatchPoller()

次に例を示します。

<cfscript> 

    gqlClient = getGraphQLClient({ 

      service_url : &quot;https://apollo-fullstack-tutorial.herokuapp.com/graphql&quot;, 

      root_folder: &quot;root&quot;, 

  //&quot;raw_http_client&quot;: true, 

  headers : { 

    		keys: &quot;key&quot;, 

    		values: &quot;value&quot; 

      }, 

      &quot;batching_configuration&quot;:{ 

            &quot;enabled&quot;: true, 

            &quot;batch_interval_ms&quot;: 1000, 

            &quot;max_batch_size&quot;: 2 

      } 

    }); 

    generateGraphQLModels(); 

  

    writedump(gqlClient) 

    queryObj = gqlClient.query(&quot;TripsBooked&quot;, {}) 

    writedump(queryObj); 

    response=queryObj.execute() 

    writeDump(response.get(&quot;Data&quot;)) 

    

    // エラーおよび成功のクロージャ関数を定義 

     onSuccess = function(response) { 

        writeOutput(&quot;<br>Received Response from GraphQL Server----------<br>&quot;); 

        writeOutput(response.toString()); 

    } 

    onError = function() { 

        writeOutput(&quot;<br>Error While Receiving Response from GraphQL Server<br>&quot;); 

    } 

    writeOutput(&quot;<br/>&quot;& &quot;Active calls count&quot; & &quot;<br/>&quot;) 

    writeOutput(gqlClient.activeCallsCount()) 

    writeOutput(&quot;<br/>&quot;& &quot;Can be batched&quot; & &quot;<br/>&quot;) 

    gqlClient.startBatchPoller(); 

    queryObj.canBeBatched(true) 

    gqlClient.stopBatchPoller(); 

</cfscript> 

canBeBatched(bool)

説明

クエリをバッチ処理できるかどうかを決定します。

シンタックス

GqlClient.canBeBatched(bool batchedTrueOrFalse)

パラメーター

  • batchedTrueOrFalse:バッチを作成する場合は True、それ以外の場合は False を指定します。

バッチ処理の例

LaunchList. graphql

query LaunchList { 
  launches { 
    cursor 
    hasMore 
    launches { 
      id 
      site 
    } 
  } 
} 

LaunchDetailsFragment.graphql 

fragment launchFragment on Launch { 

  id 

  site 

  mission { 

    name 

  } 

} 

  

query LaunchDetailsFragment($id:ID!)  { 

  launch(id: $id) { 

    # Usage of named fragment 

    ...launchFragment 

  } 

} 

File.cfm

出力

<cfscript> 
    gqlClient = getGraphQLClient({ 
      service_Url : &quot;https://apollo-fullstack-tutorial.herokuapp.com/graphql&quot;, 
      root_folder: &quot;root&quot;, 
  //&quot;raw_http_client&quot;: true, 
  headers : { 
    		keys: &quot;key&quot;, 
    		values: &quot;value&quot; 
      }, 
      &quot;batching_configuration&quot;:{ 
            &quot;enabled&quot;: true, 
            &quot;batch_interval_ms&quot;: 1000, 
            &quot;max_batch_size&quot;: 2 
      } 
    }); 

    generateGraphQLModels(); 
    writedump(gqlClient) 
    queryObj = gqlClient.query(&quot;LaunchList&quot;,{cursor:&quot;1583556631&quot;}); 

    writedump(queryObj); 

    response=queryObj.execute() 

    writeDump(response.get(&quot;Data&quot;))  

    queryObj2 = gqlClient.query(&quot;LaunchList&quot;, {cursor:&quot;&quot;});  

    queryObj3 = gqlClient.query(&quot;LaunchDetailsFragment&quot;,[id:&quot;89&quot;]); 

    response3=queryObj3.execute() 

    writeDump(response3.get(&quot;Data&quot;)) 

    //queryObj4 = gqlClient.query(&quot;LaunchDetailsFragment&quot;,[id:&quot;90&quot;]); 

    gqlClient.startBatchPoller();  

    queryObj.canBeBatched(true);	 

    queryObj2.canBeBatched(true);	 

    queryObj3.canBeBatched(true);	 

    gqlClient.stopBatchPoller(); 

    writeOutput(&quot;Completed&quot;);  

</cfscript> 

出力

{launches=Launches{__typename=LaunchConnection, cursor=1583556631, hasMore=true, launches=[Launch{__typename=Launch, id=110, site=KSC LC 39A}, Launch{__typename=Launch, id=109, site=CCAFS SLC 40}, Launch{__typename=Launch, id=108, site=VAFB SLC 4E}, Launch{__typename=Launch, id=107, site=KSC LC 39A}, Launch{__typename=Launch, id=106, site=CCAFS SLC 40}, Launch{__typename=Launch, id=105, site=CCAFS SLC 40}, Launch{__typename=Launch, id=104, site=KSC LC 39A}, Launch{__typename=Launch, id=103, site=KSC LC 39A}, Launch{__typename=Launch, id=102, site=KSC LC 39A}, Launch{__typename=Launch, id=101, site=CCAFS SLC 40}, Launch{__typename=Launch, id=100, site=CCAFS SLC 40}, Launch{__typename=Launch, id=99, site=KSC LC 39A}, Launch{__typename=Launch, id=98, site=CCAFS SLC 40}, Launch{__typename=Launch, id=97, site=CCAFS SLC 40}, Launch{__typename=Launch, id=96, site=CCAFS SLC 40}, Launch{__typename=Launch, id=95, site=CCAFS SLC 40}, Launch{__typename=Launch, id=94, site=KSC LC 39A}, Launch{__typename=Launch, id=93, site=KSC LC 39A}, Launch{__typename=Launch, id=92, site=KSC LC 39A}, Launch{__typename=Launch, id=91, site=CCAFS SLC 40}]}} {launch=Launch{__typename=Launch, fragments=Fragments{launchFragment=LaunchFragment{__typename=Launch, id=89, site=CCAFS SLC 40, mission=Mission{__typename=Mission, name=Starlink 3}}}}} 

ヘルプをすばやく簡単に入手

新規ユーザーの場合

Adobe MAX 2025

Adobe MAX Japan
クリエイターの祭典

2025 年 2 月 13 日
東京ビッグサイト