在ASP.NEt MVC4应用程序中,需要创建Json Web api来处理请求 可以用以下网址表示:
http://localhost:52216/erp/api/customers
返回所有客户
http://localhost:52216/erp/api/customers?term=soft
返回同样包含“soft”的客户的列表。用于自动完成。
这些请求的结果必须是包含单个属性的json对象,包含找到的客户数组的客户。
3。
将请求发布到http://localhost:52216/erp/api/customers
应该将请求体中指定的新客户添加为json
此方法的结果必须是包含单个属性的json对象,客户包含已保存的客户,并且某些属性已更改。
对于此API控制器,尝试使用以下内容。
键入浏览器http://localhost:52216/erp/api/customers
以xml格式返回错误
<Error><Message>No HTTP resource was found that matches the request URI 'http://localhost:52216/erp/api/customers'.</Message>
<MessageDetail>No action was found on the controller 'Customers' that matches the request.</MessageDetail>
</Error>
如何解决这个问题? 对于这样的请求,哪种方法是克里特API类?
请求返回数据格式无法更改。 如果需要,可以更改类方法名称,并可以创建具有不同名称的单独方法。
using Erp.Models;
using System.Web.Http;
namespace Erp.Controllers
{
[Authorize]
public class CustomersController : ApiController
{
public object Get(string term)
{
Customer[] res = CustomerRepository.GetAllOrForTerm(term);
return new { customers = res };
}
public object Post([FromBody]Customer customer)
{
Customer res = CustomerRepository.Save(customer);
return new { customer = res };
}
}
}
使用默认路由:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
更新
应用程序从erp虚拟目录运行,因此删除它无济于事。
我也在浏览器中试过
http://localhost:52216/erp/api/customers/get
和
http://localhost:52216/erp/api/customers/Get
但收到错误
<Error>
<Message>
No HTTP resource was found that matches the request URI 'http://localhost:52216/erp/api/customers/get'.
</Message>
<MessageDetail>
No action was found on the controller 'Customers' that matches the request.
</MessageDetail>
</Error>
答案 0 :(得分:2)
以下控制器应该可以正常使用默认路由配置:
public class CustomersController : ApiController
{
// This will match GET /api/customers
public HttpResponseMessage Get()
{
Customer[] res = CustomerRepository.GetAllCustomers();
return Request.CreateResponse(HttpStatusCode.OK, result);
}
// This will match GET /api/customers?term=foo_bar
public HttpResponseMessage Get(string term)
{
Customer[] res = CustomerRepository.GetAllOrForTerm(term);
return Request.CreateResponse(HttpStatusCode.OK, res);
}
// This should match POST /api/customers
public HttpResponseMessage Post(Customer customer)
{
...
return Request.CreateResponse(HttpStatusCode.Created, customer);
}
}
同样在您的代码中,您似乎已使用CustomersController
属性修饰了[Authorize]
,而没有实际解释您正在使用的授权机制类型。但无论如何,如果您使用授权,请确保为请求提供有效凭据。
当您使用它时,请结帐ServiceStack作为Web API的替代方案。您将会惊讶于在.NET中编写RESTful Web服务的难易程度。在Web API v2中,他们通过引入基于属性的路由(简化路由)向ServiceStack迈进了一步,但他们还有另一个步骤,即基于消息的服务。那么Web API将非常有用。在他们完成最后一步之前,我将继续使用ServiceStack,它提供了如此简单的服务来编写RESTfule服务。