web-dev-qa-db-ja.com

コントローラーアクションの命名規則

命名規則にあるように、WebApiコントローラーアクションの名前はGet()、Put()である必要があります。 Post()など。しかし、コントローラーがCustomerControllerであるかどうかを教えてください。ここで、その中に2つのアクションを入れたいと思います。 1つはGetCustomerById(int id)で、もう1つはGetCustomerByAge(int age)です。ここでは、両方のアクションが1つのパラメーターをintとして受け入れます。

したがって、URLを"api/customer /"のようにユーザーフレンドリーにしたい場合は、アクションの命名規則に従ってGet(int id)/ Get(int age) )、どうすればよいですか?

7
shou

ルーティング時にWebApiでアクション名を検索する場合は、App_StartフォルダーのWebApiConfig.csクラスを以下に変更します。

config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{action}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

次に、GETリクエストを行うことができます

http://mysite/api/customer/GetCustomerById/1

また、理解を深めるために、以下の記事を検討することをお勧めします。

アクション名によるルーティング

6
Usman Khalid

別の方法は、HTTPメソッド属性です。

HTTPメソッドの命名規則を使用する代わりに、アクションメソッドをHttpGet、HttpPut、HttpPost、またはHttpDelete属性で装飾することにより、アクションのHTTPメソッドを明示的に指定できます。

次の例では、FindProductメソッドがGETリクエストにマップされています。

public class ProductsController : ApiController
{
    [HttpGet]
    public Product FindProduct(id) {}
}

アクションに複数のHTTPメソッドを許可する、またはGET、PUT、POST、およびDELETE以外のHTTPメソッドを許可するには、HTTPメソッドのリストを取得するAcceptVerbs属性を使用します。

public class ProductsController : ApiController
{
    [AcceptVerbs("GET", "HEAD")]
    public Product FindProduct(id) { }
}
3
Abou-Emish

これは、手紙の基準に従うことが実際にはあまり役に立たない状況の1つです。

1つの解決策は、RESTスタイルから逸脱できるようにすることです。

2つのgetメソッドがあります。

1つはGetByID、もう1つはGetByAgeである可能性があります。

ルートは次のようになります。

api/customer/getbyage/20 api/customer/getbyid/1134

これは正確にはREST)ではありませんが、十分に近く、1つの例外で何も壊れません。

私のポイントは、製品が理にかなっているのに役立つ実装を使用し、標準についてあまり心配しないことです。

1

RestfulサービスのURIにCRUD関数名を含めないでください( https://restfulapi.net/resource-naming/

これはより適切です:

getByIdの場合-http://mysite/api/customers/123

getByAgeの場合-http://mysite/api/customers?age=21

0
Nandun