2

私は最初のAPIを構築していますが、ここでの最善のアプローチは何か疑問に思っています。ブールフィールド「isArchived」を持つオブジェクトがあります。ユーザーがオブジェクトの[アーカイブ]をクリックしたときに、このブール値を反転させたいと思います。私の質問:次のようなものを呼び出すことはできますか?

PUT /api/objects/archive/1

これは、次のようなロジックでコントローラーにヒットします。

    [ActionName("archive")]
    public HttpResponseMessage ArchiveObject(int id)
    {
        if (!ModelState.IsValid)
        {
            return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
        }

        _service.ArchiveObject(id);

        return Request.CreateResponse(HttpStatusCode.OK);
    }

または、次のような方法でパッチを適用することをお勧めします。

PATCH /api/objects/1

次に、次のような本文でデータを送信します

{isArchived: true}

IDだけでなくデータを送信しているため、後者の方がコストがかかるようです。何が最善で、なぜですか?

4

1 に答える 1

2

RESTful とは何かが、基本的にここでの質問です。

本当に深く楽しい説明が必要な場合は、この叙事詩的で有名な REST の「記事」を確認することを強くお勧めします: How I Explained REST to My Wife

それでは、具体的な質問に戻ります。REST の精神では、適切な「リソース」を作成する必要があります。あなたの場合、それは「アーカイブオブジェクト」リソースを意味します。そして、それに対して HTTP 動詞を適用するだけです。これは本質的に RESTful サービスです。

アクションに名前を付けようとしている場合は、おそらく間違った道を進んでいます。

じゃあ何をすればいいの?「アーカイブ オブジェクト」の WebAPI コントローラーを作成し、関数が冪等ユーザーの適切な HTTP 動詞であると推測します。作成の場合は POST、更新の場合は PUT シナリオ (べき等関数)。POST (作成) シナリオで新しいリソース URI を返すことを忘れないでください。しかし、私があなたのコードから見ることができる限り、あなたは PUT シナリオまでです。オブジェクトを何度もアーカイブすることができるので(私は推測します)。

追加データ (あなたの場合{isArchived: true}) を API に送信する方法は? 簡単に言えば、そのようなデータをリクエストの本文に入れるだけです。そのため、HTTP リクエストに本文メッセージが含まれています。

したがって、PUT URI は次のようになります。

PUT /api/objects/achive/1

つまり、オブジェクトコントローラーと「アーカイブコントローラー」があることを意味します。いいですね。適切な REST を実行すると、API は非常に美しく、理解しやすく、使いやすくなります。これが RESTful サービスのすべてです。

于 2013-03-08T06:20:07.670 に答える