動的でステートフルなモック サーバー

APIGit

2022-10-15

APIGit は、複雑なビジネス ロジックを簡単にシミュレートするために、動的でステートフルなプログラム可能なモック サーバーをサポートしています。 HTTP 要求メッセージは、mock.define() を使用してルートを定義し、URL パターン、HTTP 動詞、およびコールバック関数を提供することによって処理されます。例えば:

mock.define('/users', 'GET', function(req, res) {
    ...
  })

または、POST メソッドの場合:

mock.define('/users', 'POST', function(req, res) {
    ...
  })

「DELETE」、「PUT」、「OPTIONS」メソッドなどの標準 HTTP メソッドがサポートされています。提供するコールバック関数には、常に Request オブジェクトと Response オブジェクトの 2 つのオブジェクトがパラメーターとして渡されます。 Request オブジェクトには、ヘッダー、ボディ ペイロード、パラメーターなど、着信要求に関連するすべてのデータが含まれます。 Response オブジェクトを使用して、リクエストに対するレスポンスを作成します。

上記の例を拡張して、ユーザー向けの基本的な CRUD サービスの構築を開始しましょう。まず、一連のユーザーを返すルートを定義しましょう。

mock.define('/users', 'GET', function(req, res) {
    var users = [ 
      { username: "dave", email: "dave@gmail.com" },
      { username: "john", email: "john@gmail.com" }
    ]
  
    return res.json(users)
  })

res.json 呼び出しは、呼び出し元のアプリケーションに JSON 応答を送信します。 res オブジェクトで応答関数を呼び出すことを忘れないでください。これがないと、サービスがタイムアウトし、成功した結果が返されません。他の利用可能な応答関数については後で説明します

クエリ パラメータを使用して、ユーザーの年齢に基づくフィルタリングのサポートを追加しましょう。 req.query は、解析されたクエリ文字列を含むオブジェクトで、デフォルトは {} です。 「GET /users?age=30」のリクエストを送信すると、req.query.age で年齢の値にアクセスできます。

mock.define('/users', 'GET', function(req, res) {
    var users = [
      { username: "dave", email: "dave@gmail.com", age: 32 },
      { username: "john", email: "john@gmail.com", age: 30 }
    ]
  
    if (req.query.age) {
      // convert req.query.age from String to a Number before filtering
      return res.json(_.filter(users, { 'age': Number(req.query.age) }))
    }
  
    return res.json(users)
  })

LoDash _.filter 関数を使用して、提供された年齢に一致するユーザーの配列を抽出します。年齢基準に一致するユーザーがいない場合、空の配列が返されます。完全な LoDash ライブラリを使用できます。これは、配列とオブジェクトを操作するための便利な機能を提供します。

1 人のユーザーを取得するためのルートを作成するには、ルート パラメーターをサービスの URL パスの一部として使用します。ルート パラメーターは {route_param_name} 構文を使用して指定されるため、この例では、ユーザー名でユーザーを取得する URL パスは /users/{username} になります。 req.params は名前付きルート パラメーターにマップされたプロパティを含むオブジェクトであり、ユーザー名は req.params.username として使用できます。

mock.define('/users/{username}', 'GET', function(req, res) {
    var users = [
      { username: "dave", email: "dave@gmail.com", age: 32 },
      { username: "john", email: "john@gmail.com", age: 30 }
    ]
  
    // respond with the user or an empty object if user doesnt exist
    return res.json(_.find(users, { 'username': req.params.username }) || {})
  })

ユーザーを作成するためのルートを追加しましょう。リクエストでユーザー名が送信されたことを確認し、ユーザー名がない場合は 400 エラーで応答します。 POST 要求で本文ペイロードとして送信されるデータは、req.body オブジェクトでアクセスできます。

mock.define('/users', 'POST', function(req, res) {
    // validate username is present
    if (req.body.username === undefined) {
      return res.json(400, { error: { message: "Missing username" } })
    }
  
    return res.json({ status: "ok" })
  })

デフォルトでは、すべての応答は 200 を返します。数字が res.json への唯一のパラメーターとして提供される場合、応答本文の文字列が割り当てられます。たとえば、400 は「Bad Request」で応答します。上記の例では、カスタム エラー メッセージを指定しました。

これは堅実なスタートです。単純な定型応答を返すサービスを使用すると、多くのことができますが、それだけでは十分ではありません。データを永続化し、応答を動的に生成することにより、現実的な動作をサービスに追加することに移りましょう。