> For the complete documentation index, see [llms.txt](https://docs-embed.anyflow.jp/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs-embed.anyflow.jp/trial-tour/start-intermediate-1/step1-intermediate.md).

# STEP1 | 独自のアクションを追加する

## **概要**

初級トライアルツアーで作成したソリューションをさらにアップデートさせていきましょう。

目指すべきゴールを端的に示すと以下の通りです。

<table><thead><tr><th width="111.6640625">種類</th><th width="239.7109375">Before</th><th>After</th></tr></thead><tbody><tr><td>トリガー</td><td>Google Drive<br>（ファイル/フォルダが作成された際に実行）</td><td>同様</td></tr><tr><td>アクション</td><td>Slack Bot<br>（ファイル名を投稿）</td><td><strong>HTTP（独自アクションの追加）</strong><br>&#x26;<br>Slack Bot（独自アクションのレスポンスを投稿）</td></tr></tbody></table>

***

## **0.中級用の準備を行う**

中級用のツアーを始める準備を行います。

[ソリューション一覧](https://embed.anyflow.jp/solutions)から、初級STEP4で作成したソリューションの複製を行います。

<figure><img src="https://files.readme.io/5e0dc82-image.png" alt=""><figcaption></figcaption></figure>

コピーが完了するとソリューションエディタが開きます。

<figure><img src="https://files.readme.io/df0a4f1-image.png" alt=""><figcaption></figcaption></figure>

ソリューションの名称は中級用の名前に変更しておきましょう。

Slackのアクションを2ステップ目に移動させます。

<figure><img src="https://files.readme.io/183e859-image.png" alt="" width="563"><figcaption></figcaption></figure>

ifのステップは今回は利用しないため削除します。

<figure><img src="https://files.readme.io/02fce7a-image.png" alt="" width="563"><figcaption></figcaption></figure>

***

## **1.HTTPコネクタを設定する**

独自アクションを追加するには[HTTPコネクタ](/solution-editor/actions/api-call/http.md)を利用します。

HTTPコネクタは任意のAPIを実行できるため、自社のコネクタがAnyflow Embedに登録されていなくても自社のAPIを呼び出すことができます。

### **1-1. このツアーで利用するAPIについて**

今回の中級トライアルツアーでは、HTTPコネクタでリクエストするAPIとして、Anyflowがデモ用に作成したAPIを利用します。

[\[デモ用\] 名刺画像からリード情報を読取るAPI - Anyflow Demo](https://wm5j7sd60b.apidog.io/)

<figure><img src="https://files.readme.io/90dacbf-image.png" alt=""><figcaption></figcaption></figure>

このAPIは架空の名刺管理ツールのAPIとして作成しており、名刺画像を受け取って、そこに含まれるリード情報を解析し返却するような挙動をします。

※返却される値はランダムな値であり、実際に名刺画像を読み取った結果ではありません。

あくまでも例として挙げているため、自社のAPIが利用可能な場合はそちらを使ってツアーを進めていただくことも可能です。

### **1-2. HTTPコネクタを追加する**

1ステップ目と2ステップ目の間で「ステップを追加」し、アクションとして「HTTP」を追加します。

<figure><img src="https://files.readme.io/7844057-image.png" alt=""><figcaption></figcaption></figure>

表示名は任意です。今回は`名刺読み取りAPI`としておきます。

<figure><img src="https://files.readme.io/a2585fe-image.png" alt=""><figcaption></figcaption></figure>

### **1-3. リクエストヘッダーを設定する**

[デモ用のAPI仕様書o](https://wm5j7sd60b.apidog.io/)を確認しながら設定を行います。

HTTPメソッドは`POST`を選択します。

<figure><img src="https://files.readme.io/dc8ef3f-image.png" alt=""><figcaption></figcaption></figure>

認証用のTokenをエンドユーザーから入力してもらうために、エンドユーザー変数を作成しておきます。ウィザードへの配置も忘れずに行ってください。

<figure><img src="https://files.readme.io/116bca6-image.png" alt="" width="563"><figcaption></figcaption></figure>

POSTを選択するとさらに設定項目が表示されますので、以下の内容を設定します。

<table><thead><tr><th width="254.40234375">項目</th><th>設定</th></tr></thead><tbody><tr><td>リクエストURI</td><td><a href="https://mock.apidog.com/m1/459105-0-default/api/v1/extract-business-card">https://mock.apidog.com/m1/459105-0-default/api/v1/extract-business-card</a></td></tr><tr><td>リクエストURLパラメータキー</td><td>設定不要</td></tr><tr><td>リクエストヘッダーキー</td><td></td></tr><tr><td>┗ Content-Type</td><td>application/json</td></tr><tr><td>┗ Authorization</td><td>Bearer {Token}<br>※Bearerと{Token}の間には半角スペースを入れてください</td></tr><tr><td>リクエストタイプ</td><td>json</td></tr></tbody></table>

<figure><img src="https://files.readme.io/72c6418-image.png" alt=""><figcaption></figcaption></figure>

### **1-4. リクエストボディを設定する**

リクエストボディの入力方法は`デフォルト`にします。

リクエストボディ定義は、「JSONで追加」を選択します。

<figure><img src="https://files.readme.io/94e04cf-image.png" alt=""><figcaption></figcaption></figure>

JSONを入力するモーダルが表示されるので、以下のJSONをコピーして貼り付けます。

＜JSON＞

```json
{
    "file_name": "business-card.png",
    "file_content": "iVBORw0KGgoAAAANSUhEUgAAATYAAACjCAMAAAA3vs..."
}
```

<figure><img src="https://files.readme.io/cccdacb-_2024-04-24_20.31.56.png" alt="" width="563"><figcaption></figcaption></figure>

「生成する」を押すとリクエストボディの定義が自動で生成されます。

<figure><img src="https://files.readme.io/e373ffc-image.png" alt=""><figcaption></figcaption></figure>

リクエストボディには、Google Driveトリガーで取得した値を設定します。

file\_name : `Name`

file\_content：`b64encode(File contents)` ※[Formula](/solution-editor/common-specs/formula.md)を使って記述します

<figure><img src="https://files.readme.io/855b5a6-image.png" alt=""><figcaption></figcaption></figure>

### **1-5. レスポンスの設定を行う**

リクエスト側と同じ要領で、レスポンス側も設定を行います。

レスポンスヘッダー定義：設定不要

レスポンスタイプ：`json`

レスポンスボディ定義：以下のJSONを追加します。

```json
{
    "status": "success",
    "code": 200,
    "message": "名刺データを読み取りました。",
    "data": {
        "id": 1,
        "company": "株式会社AAA",
        "department": "開発部",
        "name": "田中 太郎",
        "email": "[email protected]"
    }
}
```

<figure><img src="https://files.readme.io/efff69b-image.png" alt="" width="563"><figcaption></figcaption></figure>

***

## **2.レスポンスをSlackで投稿する**

HTTPで取得したレスポンスをSlackで投稿します。

例として、レスポンスの`{data}`に含まれる要素を一通り追加しています。

<figure><img src="https://files.readme.io/41a5744-image.png" alt=""><figcaption></figcaption></figure>

***

## **3.テスト実行する**

今回のAPI仕様を踏まえると、ソリューションが成功するためには以下が必要になります。

1. ウィザードのToken欄に正しいトークン（`anyflowtesttoken`）が入力されていること

   <figure><img src="https://files.readme.io/cb68906-image.png" alt=""><figcaption></figcaption></figure>
2. Google Drive にアップロードされたファイルが画像ファイル（`png/jpeg`）であること

これを踏まえて、成功パターンと失敗パターンのテスト実行を行います。

### **3-1.成功することの確認**

ウィザードのToken欄に`anyflowtesttoken`を入力します。

Google Driveには画像ファイル（`.png/.jpeg`）をアップロードします。

Slackに以下の様なメッセージが投稿されていれば成功です。

<figure><img src="https://files.readme.io/35b496c-image.png" alt="" width="375"><figcaption></figcaption></figure>

### **3-2.失敗することの確認**

以下どちらかを実施します

* ウィザードのToken欄に正しくないトークン文字列（例：`invalidtoken`）を入力する
* Google Driveに画像ファイル以外のファイル（例：`.txt`）をアップロードする

いずれもSlackにはメッセージが投稿されず、ソリューションが失敗になっているはずです。

<figure><img src="https://files.readme.io/7954215-image.png" alt="正しくないトークンを入力した場合"><figcaption><p>正しくないトークンを入力した場合</p></figcaption></figure>

<figure><img src="https://files.readme.io/0cb2e6c-image.png" alt="画像ファイル以外をアップロードした場合"><figcaption><p>画像ファイル以外をアップロードした場合</p></figcaption></figure>

***

## **4.エラーに対応する**

上記の様に、様々な理由でソリューションはエラーになり得ます。

Anyflow Embedではそれぞれのケースに対応する機能を持っています。（詳細は[こちら](/ops/solution-error.md)）

今回は

* エラー監視ステップの導入
* Google Drive トリガーへの条件付与

によりエラーへの対応を追加します。

### **4-1.エラー監視ステップの導入**

ステップ1と2の間に「エラー」ステップを追加します。

<figure><img src="https://files.readme.io/ebb03cb-image.png" alt=""><figcaption></figcaption></figure>

「エラー監視」と「エラーならば」のステップが追加されるので、エラー監視の内側にHTTPとSlackのステップを移動します。

<figure><img src="https://files.readme.io/fbaf4b0-image.png" alt=""><figcaption></figcaption></figure>

「エラーならば」の内側に、新たにSlackコネクタを配置し、エラー時のメッセージを設定します。

Anyflow EmbedのSDKが設置されている画面のURLを添えておくと、[ソリューション実行履歴](/ops/solution-history.md)からエンドユーザー自身でエラー内容を確認することができます。

```
// 例
エラーが発生しています。
以下のURLから内容を確認してください。
https://your-product.com/integration/
```

<figure><img src="https://files.readme.io/38eab85-image.png" alt=""><figcaption></figcaption></figure>

これによりエラーが発生した際に「エラーならば」の内側のステップが実行され、Slackメッセージが送られますが、ソリューションの結果としては「成功」のステータスになってしまいます。

これを「失敗」のステータスにするために、[停止ステップ](/solution-editor/logic/stop.md)を追加します。

停止ステップを使うとソリューションを強制的に停止させ、実行ステータスを「成功」「失敗」のどちらかに固定することができます。

「エラーならば」の内側で停止ステップを追加します。

<figure><img src="https://files.readme.io/b7714f4-image.png" alt=""><figcaption></figcaption></figure>

実行ステータスは「失敗にする」を選択します。

<figure><img src="https://files.readme.io/7db99f2-image.png" alt=""><figcaption></figcaption></figure>

改めてテストを行います。

ウィザードのToken欄には、正しくないトークン文字列（例：`invalidtoken`）を入力します。

ステータスが「失敗」になっていて、Slackにエラー通知が発生していれば完了です🎉

<figure><img src="https://files.readme.io/dc4561e-image.png" alt="テスト結果のステータスが「失敗」になっている" width="600"><figcaption><p>テスト結果のステータスが「失敗」になっている</p></figcaption></figure>

<figure><img src="https://files.readme.io/daf3f8a-image.png" alt="Slackにエラーの投稿がされている" width="400"><figcaption><p>Slackにエラーの投稿がされている</p></figcaption></figure>

今回の場合、エンドユーザーがGoogle Driveを日常的に使うなかで、画像以外のファイルをUPしてしまうことは容易に考えられます。

その度に毎回通知が飛ぶのはユーザー体験を損ねるため、処理を修正します。

ステップ1を選択し「トリガー条件」を開きます。

<figure><img src="https://files.readme.io/716a2e0-image.png" alt=""><figcaption></figcaption></figure>

条件を満たす場合のみトリガーを有効化できるため、2つの条件を設定します。

**if　Mime type　等しい　image/png**

<figure><img src="https://files.readme.io/fb2112a-image.png" alt="" width="563"><figcaption></figcaption></figure>

**OR　Mime type　等しい　image/jpeg**

<figure><img src="https://files.readme.io/00f3176-image.png" alt="" width="563"><figcaption></figcaption></figure>

改めてテストを行います。

Google Driveに画像ファイル以外のファイル（例：`.txt`）をアップロードします。

<figure><img src="https://files.readme.io/d7f4d6a-image.png" alt=""><figcaption></figcaption></figure>

`.txt`ファイルをUPしたにもかかわらずトリガーの待機状態が維持されており、

`.png/.jpeg`ファイルをUPした場合にトリガーの待機状態が解除されていたら、完了です🎉

***

## **まとめ**

中級編 STEP1 お疲れ様でした。

今回のセクションでは、HTTPコネクタやエラーへの対応について学ぶことができました。

HTTPコネクタを使うと`独自のアクション`を組み込んだソリューションを作成することができます。

今回はデモ用API での紹介でしたので、ぜひ実際のAPIでも試してみてください。

初級編と比べてボリュームも増えていますので、不明点があればAnyflow CSチームにご連絡ください。

***

## **ネクストステップ**

次は、`独自のトリガー`を組み込む方法をご紹介します。

[STEP2 | My Event を理解する](/trial-tour/start-intermediate/step2.md)

にお進みください。


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs-embed.anyflow.jp/trial-tour/start-intermediate-1/step1-intermediate.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
