如何使用ASP.NET MVC4和Web API为预定义的json结果创建客户api

时间:2013-11-24 13:21:16

标签: c# asp.net-mvc asp.net-mvc-4 asp.net-web-api asp.net-web-api-routing

在ASP.NEt MVC4应用程序中,需要创建Json Web api来处理请求 可以用以下网址表示:

  1. http://localhost:52216/erp/api/customers 返回所有客户

  2. http://localhost:52216/erp/api/customers?term=soft 返回同样包含“soft”的客户的列表。用于自动完成。

  3. 这些请求的结果必须是包含单个属性的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>
    

1 个答案:

答案 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服务。