4

TL; DRの概要:HTTP GET、PUT、およびDELETE用にMVC Web APIルーティングを構成できますか?

成功した場合にパブリックAPIを作成する目的で、古いデータアクセス層(DataSetsとTableAdaptersに基づくDLL)をプライベートAPIに置き換えることを検討してきました。私はMVC4を使用してフロントエンドを更新し、それを使用するのが大好きだったので、WSベースまたはWCFベースのライブラリに飛び込む前に「WebAPI」プロジェクトタイプを調べるのが賢明なようです。

最初のデモでは、XML/JSONを適切に返すことができます。次に例を示します。

//service.url/api/Users

...ユーザーのリストを返しますが、特定のユーザーの詳細には次の方法でアクセスできます。

//service.url/api/Users/99

これまでのところ、RESTfulです。ただし、URIをリソースに実際にマップするために、HTTP PUT(新しいユーザー)またはHTTP DELETE(ユーザーの削除)を上記のURIに実行します。これらのプロジェクトで見たすべての例と、Visual Studioで提供されるスキャフォールドでは、次の規則に従います。

//service.url/api/Users/Create

//service.url/api/Users/Delete/99

//service.url/api/Users/Update/99

... 等々。これは私にとって問題を回避しているように感じます。それは、そこにあるものがとてもうまくまとめられているときは残念です!

これにアプローチする最善の方法について何か考えはありますか?

4

2 に答える 2

8

必要なのは、MVC Web API のデフォルトです。何を見ているのかわかりませんが、これは Get/Post/Put/Delete を actions にルーティングする素晴らしい例です。

たとえば、次のことが必要な場合があります。

public class UsersController : ApiController
{
  // GET http://service.url/api/Users/1
  [HttpGet]
  public User GetUser(int id);

  // POST http://service.url/api/Users/?name=richard...
  [HttpPost]
  public User AddUser(User model);      

  // PUT http://service.url/api/Users/?id=1&name=Richard...
  [HttpPut]
  public User UpdateUser(User model);

  // DELETE http://service.url/api/Users/1
  [HttpDelete]
  public User DeleteUser(int id);
}

これらを明示的に設定しましたが、GetUserは一致する HTTP メソッドで始まるDeleteUserため、プレフィックスは必要ありません。

于 2012-12-29T18:00:59.720 に答える
4

Erik によって提供されたリンクは良い出発点ですが、HTTP 動詞を使用してこれらの CRUD アクションを実行する単純な RESTful API を探すときに、状況を混乱させる可能性があることがわかります。GET、PUT、POST、および DELETE の HTTP 動詞 (およびおそらく PATCH ですが、ここでは説明しません) を使用しようとしていて、規則を使用しても問題ない場合は、次のように動作します。

public class UsersController : ApiController
{
    // GET http://service.url/api/Users
    public User GetAllUsers(){ ... }

    // GET http://service.url/api/Users/1
    public User GetUser(int id){ ... }

    // POST http://service.url/api/Users/
    // User model is passed in body of HTTP Request
    public User PostUser([FromBody]User model){ ... }

    // PUT http://service.url/api/Users/1
    // User model is passed in body of HTTP Request
    public User PutUser(int id, [FromBody]User model){ ... }

    // DELETE http://service.url/api/Users/1
    public User DeleteUser(int id){ ... }
}

Web API で HTTP 動詞アクション規則を使用する場合、メソッドの属性は必要ないことに注意してください。また、POST および PUT の User パラメーターで [FromBody] 属性を使用して、送信したいデータが本文に含まれていることを示していることにも注意してください。リソースに追加しようとしている場合、これは POST にとって最も便利ではない可能性があり、Web API を使用してクエリ パラメーターを使用してデータを作成/変更しようとしたことはありません。データを本体に配置することで、呼び出しが非常にきれいに感じられることは確かです。「このコンテンツを本文のこのリソースに POST/PUT します。」

また、仕様での PUT の読み方は間違っている可能性が非常に高いですが、それは置き換えとして機能するということです。上記の最後の行を考えると、これも理にかなっています。このリソースをこの場所に置き、既存のものを置き換えます。仕様 ( http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html ) には次のように記載されています。 1つはオリジンサーバーに存在します。」彼らが使用する用語は「変更された」ので、エンドユーザーに解釈の余地が十分にあると思います. ここで PATCH の出番です ( https://www.rfc-editor.org/rfc/rfc5789 ) が、現時点ではコメントするのに十分な情報がありません。

于 2013-04-10T21:05:04.130 に答える