0

我正在使用ASP.NET Web API (4 RTM) 并想创建一个方法来处理 GET 请求。将其视为GetCustomer()处理我的 GET 请求。
现在,通过客户 ID 获取客户非常简单;我将客户 ID 传递给我们,querystring然后我们就开始运行了。假设我希望选项传递两个可能的参数之一;代表客户的整数或缩写。

一种选择是使用单一方法来处理整数和字符串的 GET 请求。然后,在方法内部,我可以测试该值是否能够被解析为整数并相应地处理它。但这是处理这种情况的正确方法吗?

如果我应该有两种不同的方法,我该怎么做?

4

2 回答 2

0

从您提到使用(可能是唯一的)ID 中,您可能需要一个单独的操作方法。但是从您对单一意图的描述来看,单一控制器方法可能是要走的路 - 请注意,您仍然不必手动解析字符串,MVC 模型绑定器可以为您做到这一点。

如果您有单独的方法,它们必须有不同的 URL。它们可能是重载的相同方法名称,但它们仍然必须使用 ActionName 属性进行修饰以分配它们不同的身份。(请注意,您可以使用其他选择器属性来区分,例如 [HttpPost] 或自定义属性。)

请注意,您还可以使用需要参数的 MapRoute(在 Global.asax 中)根据其参数有条件地在 URL 上调用不同的控制器方法。

在一个地方处理所有相同类型的活动的好处是代码变得更清晰、更易于维护并且更不容易出错。如果你发现情况并非如此,那就分手吧。这是我所说的常见的不要重复自己/单点真理/责任分离的东西。

作为一般规则,我在 MVC 中发现 URL 路径(没有查询字符串)、控制器方法和意图都沿着相同的路线分解。例如,这两个 URL 遵循该规则:

http://example.com/person/id/403
http://example.com/person/search?FirstName=Joe&LastName=Smith

我们在 URL 中表达我们的意图,以获取单个人或可能的多个匹配项。

你说你可能会传递一个缩写(听起来不像是唯一的),作为两个参数之一。如果每个可选参数都是独立唯一的,那么一次形成一个以上的问题可能没有意义。如果您可能有 a、b 或 a AND b,那么在实际输入您的自定义控制器逻辑的主力之前确定将请求传递给哪个方法会变得很复杂。

此外,像 LINQ 这样的技术可以很容易地以程序方式动态组合查询,从而对结果进行一个或两个约束。

[HttpGet]
public ViewResult Search(string FirstName, string LastName) {
     var people = AllPeopleInDatabase();
     if (!string.IsNullOrEmpty(FirstName)) people=people.Where(p => p.FirstName==FirstName);
     if (!string.IsNullOrEmpty(LastName)) people=people.Where(p => p.LastName==LastName);
     return View(people);
}

将唯一 ID 放入该组合对我来说没有意义,只是因为我无法想到一个编程场景(除了密码验证的相当独特的情况),如果另一个条件匹配,您只想获取指定的记录. 因此,如果有人要求一个 id 并且它不存在,这可能是一个错误情况,如果有人按照不产生结果的条件进行搜索,它可能不是一个错误情况。但是,您仍然可以:

public ViewResult Search(string FirstName, string LastName, int? id) {

编辑:还要注意模型绑定器将处理类的属性,这是绑定多个参数的典型方法:

public ViewResult Search(MyCriteriaViewModel criteria) {

编辑2:还请注意,RESTful 服务(WebAPI 非常适合)具有 CRUD URL 的标准做法。以下来自http://www.asp.net/web-api/overview/creating-web-apis/creating-a-web-api-that-supports-crud-operations

Action                      HTTP method  Relative URI
Get a list of all products  GET          /api/products
Get a product by ID         GET          /api/products/id
Get a product by category   GET          /api/products?category=category
Create a new product        POST         /api/products
Update a product            PUT          /api/products/id
Delete a product            DELETE       /api/products/id

祝你好运!

于 2012-09-01T00:11:19.163 回答
0

就个人而言,我只会使用一个入口点来访问这种代码:

http://example.com/lookupUser?id=18475
http://example.com/lookupUser?userCode=jjs
http://example.com/lookupUser?FullName=Jeremy%20J%20%Starcher

好吧,也许不是最后一个例子,因为可能有多次点击。

于 2012-08-31T23:18:57.057 回答