コンポーネントの入力Payloadと出力Payloadとプロパティ
コンポーネントを並べてアクションを作る様は、コマンドラインでコマンドを並べてパイプで標準出力と標準入力をつないでコマンドを起動していくのに似ています。
$ cat test.txt | sort | grep “^abc”
$ echo Hello | sendmail sample@asteria.com
標準入力や標準出力(またはパイプ)をGravio4ではPayload(場面によって入力Payloadや出力Payload)と呼び、パイプではバイト列(≒文字列)のみを送ることができますが、Payloadではバイト列、文字列以外にも数値、Boolean、JSON Array/Objectを送ることができます。
コマンドのオプションや引数(sendmailの送信先など)はコンポーネントではコンポーネントプロパティと呼びコンポーネントの動作を決めることができます。
sortやgrepなどのテキスト処理を主としているコマンドは何を入力とし何を出力とすべきかはわかりやすいですが、テキスト処理を主としていなくコマンド処理そのものが主目的のコマンドは何を出力すべきかは悩ましいです。上記sendmailの例では何を次のコマンドに渡すのがいいと思いますか?
シェルでコマンドを実行する時はパイプで繋がなくてもコマンドを実行する手段がありますが、アクションではPayloadで繋ぐ以外の方法はありません。
つまりコンポーネントが実行されるには必ず入力Payloadがあり、次のコンポーネントを起動するには必ず出力Payloadが必要になります。
その入力Payloadをどう使うかはコンポーネント毎に違い、何を出力Payloadとするかもコンポーネント毎に違います。
実際にはPayloadはコンポーネント変数をセットで送られ、Payloadはコンポーネント変数の一部として送られます。Payloadを参照するのに cv プレフィックスを使うのはそのためです。
具体的にCSVRead/CSVWrite/HTTPRequest/MailSendで、入力Payloadをどう扱い、何を出力Payloadとしているか見ていきます。
CSVRead
CSVReadコンポーネントはCSVを解析し出力形式によってJSON配列またはJSON Objectを出力とします。
CSVReadにはInputプロパティがあり、CSVを解析するソースを選択できます。PayloadかFileを選べますが、Payloadを選ぶと入力Payloadをソースとし、Fileを選ぶとFilenameプロパティで指定されたファイルをソースとします。
入力Payloadがバイト列や文字列だった場合はそのままソースとなりますが、それ以外の型の場合は文字列に変換してからソースにしています(その他の型を文字列に直してCSVパーサーに渡しても大抵の場合は解析エラーとなるでしょう)。
CSV解析が終わった後はOutputプロパティに応じて出力Payloadを生成します。OutputプロパティはArrayとObjectが選べますが、Arrayを選んだ場合はCSVの各フィールドを文字列にした配列を各行毎に出力Payloadとして次のコンポーネントに渡ります。
OutputプロパティでObjectを選ぶと、CSVの1行目をキーとみなしJSON Objectを生成し各業毎に出力Payloadとして次のコンポーネントに渡ります。
CSVWrite
おかしいことに気がついた。後で修正
HTTPRequest
HTTPRequestコンポーネントは入力Payloadをプロパティに応じでBodyとしてリクエストをだし、HTTPレスポンスBodyを出力Payloadとします。
Content-Typeプロパティに応じて入力Payloadをどうするか決めています。
Content-Typeが(none)の時は入力PayloadをBodyとして出力しません。
(default)の時は入力Payloadの型に応じてContent-Typeを自動で選びます。文字列型text/plain; charset=utf-8で文字を出力、JSON配列、JSON Objectはapplication/jsonにしPayloadをMarshalしたバイト列で出力、バイト列application/octet-stream、その他text/plainにし文字列に直したものをBodyとして出力。
(application/x-www-form-urlencoded)の時は、入力PayloadはJSON Object型を期待し、キーと値を=ではさみ、それぞれを&で区切った形でBodyに出力します。JSON Object型以外はエラーとしています。
(multipart/form-data)の時は、入力PayloadはJSON Object型を期待し、キーと値をマルチパートで区切り、Content-Typeのmultipart/form-dataにはバウンダリも自動でつきます。JSON Object型以外はエラーとしています。
それ以外の任意に入力されたContent-Typeの場合は、Content-Typeはそのままにし、入力Payloadをバイト列にしたものをBodyとして出力しています。
HTTPレスポンスのBodyを出力Payloadとしてバイト列のまま出力しています。
(ここまで書いて、レスポンスのContent-Typeに応じて出力型を決めたほうが親切かもしれない。application/jsonだったら、そのままJSON Object型にするとか)
MailSend
MailSendコンポーネントは入力Payloadをメール本文としてメールを送信するコンポーネントです。
これを書いてる直前までMailSendコンポーネントは入力Payloadとして文字列型しか認めず、それ以外の型の時はエラーとしていました。
今は全ての型を受け付けるようにし文字列に直してメール本文としています。おそらく、それでは意図した動作ではないと思いますがエラーとするより送信してから間違いに気がつくがよいような気がして直しました。
メール送信後は、入力Payloadをそのまま出力Payloadとしています(パススルー)。

Feedback

Was this helpful?

Yes No
You indicated this topic was not helpful to you ...
Could you please leave a comment telling us why? Thank you!
Thanks for your feedback.

Post your comment on this topic.

Post Comment