Web Api 2 具有两个具有相同 HTTP 动词的方法和 angularjs 资源

Web Api 2 with two method with the same HTTP verb an angularjs resources

我有这个控制器:

public class SeguiAttivazioneController : ApiController
{
    [HttpGet]
    public IHttpActionResult DoWork1()
    {
        ...            
        return Ok();
    }

    [HttpGet]
    public IHttpActionResult DoWork2()
    {
        ...            
        return Ok();
    }

    [HttpGet] //I would like to have a search with GET verb, but I cannot validate my ModelState with dataAnnotation
    public IHttpActionResult AnotherSearch(string filter1, string filter2, ...)
    {
        if (ModelState.IsValid)
        {
            ...
            return Ok();
        }
        return BadRequest(ModelState);
    }

    [HttpPost]
    public IHttpActionResult DoSearch(SearchFilter filters)
    {
        if (ModelState.IsValid)
        {
            ...
            return Ok();
        }
        return BadRequest(ModelState);
    }

    [HttpPost]
    public IHttpActionResult SubmitForm(FormData data)
    {
        ...
        return Ok();
    }
}

如您所见,我有两个具有相同 HttpVerbs 的方法(2 个用于 GET,2 个用于 POST)...我不知道我是否违反了 REST 原则...如果是这样,我想避免... 此刻我正在使用 AngularJs + NgResources 来调用我的控制器..

public_area
    .factory("SeguiAttivazioneService", function ($resource) {
        //return {
        //    seguiAttivazione: $resource("/api/SeguiAttivazione/", null,
        //                        {
        //                            'get2': { method: 'GET', url: '/api/SeguiAttivazione/GetActivationStatus2' }
        //                        })
        //};
        return {
            seguiAttivazione: $resource("/api/SeguiAttivazione/")
        };
    });

我正在尝试执行 GET:

$scope.getActivationStatus = function (event) {
    event.preventDefault();

    if ($scope.segui_attivazione_form.$valid) {
        var request =
            new SeguiAttivazioneService
                .seguiAttivazione()
                .$get({ }, getActivationStatusSuccess, getActivationStatusError);
    }
};

但是(正确地)我获得了一个 "Internal Server Error 500",因为我必须使用 GET 方法。我怎么解决这个问题? (我想我也会遇到与 POST 相同的问题)

谢谢

更新 这里的过滤器 class

public class SearchFilter 
{
    [Required(ErrorMessage="")]
    public string CodiceFiscale { get; set; }
    [Required(ErrorMessage = "")]
    [RegularExpression(@"^(?:\d{11,16})|(?:[a-zA-Z]{6}[a-zA-Z0-9]{2}[a-zA-Z][a-zA-Z0-9]{2}[a-zA-Z][a-zA-Z0-9]{3}[a-zA-Z])$", ErrorMessage = "Codice Fiscale o Partita IVA non validi")]
    public string CodiceRichiesta { get; set; }
}

有了这个 class 我可以使用数据注释来验证我的模型...如果我使用 GET 方法我就不能再使用数据注释验证...

问题是 Web API 基础结构必须有一种方法来选择其中一种可能的方法。

一种方法是更改​​ Web API 路由配置,包括 /{action}/ 段。如果您这样做,它将像 MVC 一样工作,并且您必须始终包含操作名称。

另一种方法是使每个方法接收的参数不同,以便 Web API 基础结构可以发现您尝试调用的方法。您可以阅读我今天针对类似问题写的这个答案:.

作为该答案的最后评论,我说参数也可以通过使用路由约束来辨别。

必须在所有调用中包含操作名称的第一个解决方案不是 RESTful,但出于任何特定原因您需要或更喜欢它是 RESTful 吗?

这里有一些关于 REST 端点的解释。

在 REST 中,我们正在操作资源。作为 collections 或个人。

经典端点将是:

GET /rest/houses DATA : none -> will return a collection of houses

GET /rest/houses/{id} DATA : none -> will return the house find by its {id}

POST /rest/houses DATA : {"street":"3 bdv NY-city"} -> will create a new house object with the given data

PUT /rest/houses/{id} DATA : { "id":"{id}", "street":"4 bvd NY-city"} -> will update the whole house ressource find by its {id}

PATCH /rest/houses/{id} DATA : { "street":"4bvd NY-city" } -> will update the given fields of the house ressource find by its {id}

DELETE /rest/houses/{id} DATA : none -> will delete the house ressource find by its id.

关于 restfull API 要了解的东西太多了,我不能把所有的钥匙都给你。但是尝试找到一些关于这些主题的好文章,例如:

http://www.restapitutorial.com/index.html

不确定这是否能回答您的问题,但希望对您有所帮助。

编辑 1:

因为我必须添加一些关于 restfull 方法来给出一些复杂的动作,所以我会给你 restfull url 方法。

在 restful 世界中(极为罕见)你只知道休息的一个入口点 API 让我们这样说:

GET /rest/

此 uri 将响应您 api 可以提供的所有服务 例子:

{
 "resources":"/rest/ressources",
 "apiInfo" : "/rest/api/info"
}

要获取您的资源信息,您将遵循 link

 GET response.resources

我可能会这样回应:

{
 "houses":"/rest/ressources/houses/",
 "cars"  :"/rest/ressources/cars"
}

现在我们要房子

GET response.houses

回复:

 {
  "fields":[{
    "constructionYear","street"
   }],
  "search":"/rest/houses"
  "create":"/rest/houses"
 }

等...在这个地方你可以添加一些非restful端点。以 restful 的方式。此操作将由 restful 资源保留。一些 API 正在使用这种很棒的 Restful。

标准休息API: https://developers.soundcloud.com/docs/api/reference#users

Restful API : https://www.salesforce.com/us/developer/docs/api_rest/