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/
我有这个控制器:
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/