Velo:Fetch API でサードパーティサービスにアクセスする

読了時間:9分
Velo by Wix 公式サイトで Velo の特徴や機能を学んでいきましょう。

Velo を使用すると、コードを記述してサードパーティの Web サービスにアクセスすることができます。Fetch API には、HTTP リクエストを送信するための 2 つの関数、getJSON()fetch() が含まれています。JSON オブジェクトを取得するための単純な GET リクエストには、getJSON() の使用をおすすめします。より複雑なリクエストの場合、fetch() はより優れた機能を提供します。

Fetch API はフロントエンド(クライアント側)またはバックエンド(サーバー側)のコードで使用できますが、通常はバックエンドコードから外部 API にリクエストを送信することをおすすめします。これは、特に API がキーやその他の認証を必要とする場合により安全であり、フロントエンドからリクエストを送信する際に発生する可能性のあるオリジン間リソース共有(CORS)問題を回避することができます。
注意:
すべての Wix サイトは HTTPS を使用するため、サイトのコードでサービスから HTTP コンテンツをリクエストすることはできません。無効なリクエストはエラーを引き起こします。このエラーはブラウザの開発者ツールを使用して確認することができます。

getJSON( ) を使用して GET リクエストを作成する

以下の例のように、サードパーティのサービスを呼び出して、ボタンをクリックするだけでランダムな言語で挨拶のセットを取得(GET)するとします:

まず、バックエンド Web モジュールにサービスを呼び出すための getGreetings() 関数を記述する必要があります。(参考までに、Web モジュール dataFetcher.jsw を呼び出しました。後で、フロントエンドコードでこのモジュールから getGreetings() をインポートする必要があります。)

1import { getJSON } from 'wix-fetch';
2
3// GET call using getJSON
4export async function getGreetings() {
5  const response = await getJSON('https://velo-examples.wixsite.com/training-tester/_functions/greetings');
6  return response;
7}

Fetch API の getJSON() 関数をインポートすることから始め、次に getGreetings() 関数で getJSON() を呼び出してレスポンスを返します。

これで、getGreetings() バックエンド関数を呼び出して結果を表示することで、「Fetch Greetings」ボタンのクリックに応答するフロントエンドコードを記述できます。

1import { getGreetings } from 'backend/dataFetcher';
2
3// See the dataFetcher.jsw web module in the backend for the service call //
4
5$w.onReady(function () {
6  $w('#fetchAllButton').onClick(async () => {
7    $w('#fetchAllButton').disable();
8
9    const fetchedData = await getGreetings();
10    const repeaterData = fetchedData.map(item => {
11      item._id = item.id.toString();
12      return item;
13    });
14
15    $w('#helloRepeater').data = repeaterData;
16    $w('#helloRepeater').show();
17        
18    $w('#fetchAllButton').enable();
19  });
20
21  $w('#helloRepeater').onItemReady( ($item, itemData) => {
22    $item('#repeatedLanguageText').text = itemData.language;
23    $item('#repeatedHelloText').text = itemData.greeting;
24  });
25});

バックエンド Web モジュール dataFetcher.jsw から getGreetings() 関数をインポートすることから始めます。

「Fetch Greetings」ボタンがクリックされると、getGreetings() を呼び出してレスポンスを待ちます。応答が来たら、受信した ID を文字列に変換し、それらを使用してリピーターを設定します。

上記の例の詳細と実際に試してみるには、Hello Fetch のサンプルページをご覧ください。

fetch( ) を使用して GET リクエストを作成する

fetch()を使用した同様の例を考えてみましょう。

以下の例のように、サードパーティのサービスを呼び出して、ボタンをクリックするだけでランダムな言語で挨拶を取得(GET)するとします:

まず、バックエンド Web モジュールにサービスを呼び出すための getRandomGreeting() 関数を記述する必要があります。(参考までに、Web モジュール dataFetcher.jsw を呼び出しました。後で、フロントエンドコードでこのモジュールから getRandomGreeting() をインポートする必要があります。)

1import { fetch } from 'wix-fetch';
2
3// GET call using fetch
4export async function getRandomGreeting() {
5  const response = await fetch('https://velo-examples.wixsite.com/training-tester/_functions/randomgreeting');
6  if(response.ok) {
7    const json = await response.json();
8    return json.greeting;
9  } else {
10    return Promise.reject("Fetch did not succeed");
11  }
12}

getRandomGreeting() コードで呼び出す Fetch API の fetch() 関数をインポートすることから始めます。呼び出しが成功した場合、レスポンスを JSON ファイルに変換し、その greeting オブジェクトを返します。失敗した場合は Promise.reject メッセージを返します。

これで、getRandomGreeting() バックエンド関数を呼び出して結果を表示することで、「Fetch Random Greeting」ボタンのクリックに応答するフロントエンドコードを記述できます。

1import { getRandomGreeting } from 'backend/dataFetcher';
2
3// See the dataFetcher.jsw web module in the backend for the service call //
4
5$w.onReady(function () {
6  $w('#fetchRandomButton').onClick(async () => {
7    $w('#fetchRandomButton').disable();
8
9    const fetchedData = await getRandomGreeting();
10
11    $w('#languageText').text = fetchedData.language;
12    $w('#helloText').text = fetchedData.message;
13
14    $w('#languageText').show();
15    $w('#helloText').show();
16
17    $w('#fetchRandomButton').enable();
18  });
19});

バックエンド Web モジュール dataFetcher.jsw から getRandomGreeting() 関数をインポートすることから始めます。

「Fetch Random Greeting」ボタンがクリックされると、getRandomGreeting() を呼び出してレスポンスを待ちます。応答が来たら、テキストフィールドを使用してデータを表示します。

上記の例の詳細と実際に試してみるには、Hello Fetch のサンプルページをご覧ください。

fetch( ) を使用して POST リクエストを作成する

fetch() を使用して、POST などのサードパーティサービスに他のタイプのリクエストを行うこともできます。

以下の例のように、サードパーティのサービスを呼び出して、ボタンをクリックするだけで指定した言語で挨拶を書き込む(POST)とします:

まず、バックエンド Web モジュールにサービスを呼び出すための postGreeting() 関数を記述する必要があります。(参考までに、Web モジュール dataFetcher.jsw を呼び出しました。後で、フロントエンドコードでこのモジュールから postGreeting() をインポートする必要があります。)

1import { fetch } from 'wix-fetch';
2
3// POST call using fetch
4export async function postGreeting(language, greeting) {
5  const jsonBody = {
6    language,
7    greeting
8  };
9    
10  const fetchOptions = {
11    method: 'post',
12    headers: 'application/json',
13    body: JSON.stringify(jsonBody)
14  };
15
16  const response = await fetch('https://velo-examples.wixsite.com/training-tester/_functions/greeting', fetchOptions); 
17  return response.json();
18}

まず、postGreeting() 関数で呼び出す Fetch API の fetch() をインポートします。

この関数は、フロントエンドから渡される languagegreeting パラメータを受け取り、それらをサードパーティサービスに POST します。

今回は、fetchOptions と呼ばれる fetch() に追加のオプションパラメータを渡す必要があります。これらのオプションには、リクエストされたメソッド(post)、送信されるデータの形式を説明するヘッダー(application/json)、および languagegreeting 値を含む jsonBody オブジェクトが含まれます。

これで、postGreeting() バックエンド関数を呼び出して、「Post Greeting」ボタンのクリックに応答するフロントエンドコードを記述できます。

1import { postGreeting} from 'backend/dataFetcher';
2
3// See the dataFetcher.jsw web module in the backend for the service call //
4
5$w.onReady(function () {
6    $w('#postButton').onClick(async () => {
7        $w('#postButton').disable();
8
9        const putResponse = await postGreeting($w('#languageInput').value, $w('#greetingInput').value);
10
11        console.log(putResponse);
12
13        if(putResponse.success) {
14            $w('#successIcon').show();
15            $w('#errorIcon').hide();
16            $w('#responseMessage').text = putResponse.success;
17        }
18        else {
19            $w('#successIcon').hide();
20            $w('#errorIcon').show();
21            $w('#responseMessage').text = putResponse.error;
22        }
23
24        $w('#responseMessage').show();
25        $w('#postButton').enable();
26    });
27});

まず、バックエンド Web モジュール dataFetcher.jsw から postGreeting() 関数をインポートすることから始めます。

「Post Greeting」ボタンがクリックされると、対応する入力要素の language と greeting 値を使用して postGreeting() を呼び出してレスポンスを待ちます。応答が来たら、テキストフィールドを使用して、呼び出しが成功したか失敗したかを表示します。

上記の例の詳細と実際に試してみるには、Hello Fetch のサンプルページをご覧ください。

API キーを操作する

多くの場合、サードパーティの Web サービスにアクセスするために API キーが必要になります。
API キーを操作する場合は以下を推奨します:
  1. シークレットマネージャーに API キーを保管する。
  2. Secrets API を使用して API キーを抽出するコードを記述し、バックエンド Web モジュールでサービスを呼び出すようする。これにより、クライアント側のコードからサービスを呼び出そうとした場合に発生する可能性がある、API キーの漏洩などのセキュリティ上の懸念事項を回避できます。
たとえば、サードパーティの天気予報サービスを呼び出して、ユーザーが選択した都市の現在の天気を確認するとします。

まず、バックエンド Web モジュールで関数を作成し、気象サービスを呼び出してデータを取得します。コードは下記の通りです:
1//serviceModule.jsw
2
3import {fetch} from 'wix-fetch'; 
4import {getSecret} from 'wix-secrets-backend';
5
6export async function getCurrentTemp(city) {
7  const url = 'https://api.openweathermap.org/data/2.5/weather?q=';
8  const key = await getSecret(WeatherApiKey);
9    
10  let fullUrl = url + city + '&APPID=' + key + '&units=imperial'; 
11  
12  return fetch(fullUrl, {method: 'get'})
13    .then(response => response.json())
14    .then(json => json.main.temp);
15}

この例では、https リクエストを行い、シークレットマネージャーからシークレットを取得するために必要な関数をインポートすることから始めます。次に、天気を調べたい city を取り込む新しい関数を作成します。この関数は、読み出しリクエストの完全な URL を構築することから始まります。URL は、サービスのアドレスと API キーで構成されます。この例を機能させるには、「WeatherApiKey」という名前で API をシークレットマネージャーに格納する必要があります。次に、関数は実際のリクエストを行います。レスポンスを受信すると、気温データを取り出します。その気温データは、クライアント側の呼び出しによって受信されます。