0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

GraphQL の mutation と subscription を wscat と curlで簡単にやる

Posted at

背景

サクッと動作確認したい時にターミナルからできると便利。
AppSyncではコンソールからワンクリックでPub/subを行うWebSokect APIを作れる。
しかし簡単に作れると言っているこのチュートリアルでも、クライアント側はReactとAmplify JavaScriptである。もっと簡単に試したい。
サーバーレスを利用した汎用 Pub/Sub API の作成WebSockets

前提

  • APIキー認証
  • コンソールからワンクリックで作成した際のスキーマはこれ。publish(HTTPS)するとsubscribe(WSS)しているクライアントにその通知がいく。
type Channel {
	name: String!
	data: AWSJSON!
}

type Mutation {
	publish(name: String!, data: AWSJSON!): Channel
}

type Query {
	getChannel: Channel
}

type Subscription {
	subscribe(name: String!): Channel
		@aws_subscribe(mutations: ["publish"])
}

結果

Subscribe

一応細かい手順はこれを見ることになっている。WebSocketリアルタイムクライアントの構築

しかし実際のコマンドで試すならこちらのプライベートAPIについてのドキュメントがわかりやすかった(パブリックAPIでもコマンド自体は同じ)。

header=`echo '{"host":"<API_ID>.appsync-api.ap-northeast-1.amazonaws.com","x-api-key":"xxxxxxxxxxxxxxxxxxxxxxxxxx"}' | base64 | tr -d '\n'`
wscat -p 13 -s graphql-ws -c  "wss://<API_ID>.appsync-realtime-api.ap-northeast-1.amazonaws.com/graphql?header=$header&payload=e30="

接続された後は順に以下を送信すればsubscribe完了

{"type": "connection_init"}

{"id":"tekitouid","payload":{"data":"{\"query\":\"subscription SubscribeToData ($name: String!) {subscribe (name:$name) {name data}}\",\"variables\":{\"name\":\"robots\"}}","extensions":{"authorization":{"host":"<API_ID>.appsync-api.ap-northeast-1.amazonaws.com","x-api-key":"xxxxxxxxxxxxxxxxxxxxxxxxxx"}}},"type":"start"}

これでチャンネルrobotsに送publishされたメッセージを受信する。

publish

こちらはcurl. 変数を伴うパラメータはいつもわからなくなるので。。エスケープとかクォート入れる箇所とか。

curl https://<API_ID>.appsync-api.ap-northeast-1.amazonaws.com/graphql \
-H "Content-Type:application/graphql" \
-H "x-api-key:xxxxxxxxxxxxxxxxxxxxxxxxxx" \
-d '{"query":"mutation Publish($data: AWSJSON!, $name: String!) {publish(data: $data, name: $name){data name}}","variables":{"name":"robots","data":"{\"robot\":\"r2d2\", \"planet\": \"tatooine\"}"}}'

variablesのdataは "data":{"robot":"r2d2"...}とかでもダメで"data":"{\"robot\":\"r2d2\"...}"というようにきっちりダブルクォートで囲んでエスケープしないとダメそうだった。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?