【问题标题】:How Web API returns multiple typesWeb API 如何返回多种类型
【发布时间】:2012-07-31 04:39:36
【问题描述】:

我只是想知道是否可以在单个 Web Api 中返回多种类型。例如,我想要一个 api 同时返回客户列表和订单(这两组数据可能相互关联也可能不相互关联?

【问题讨论】:

    标签: c# asp.net-web-api


    【解决方案1】:

    要返回多个类型,可以将它们包装成匿名类型,有两种可能的方法:

    public HttpResponseMessage Get()
    {
        var listInt = new List<int>() { 1, 2 };
        var listString = new List<string>() { "a", "b" };
    
        return ControllerContext.Request
            .CreateResponse(HttpStatusCode.OK, new { listInt, listString });
    }
    

    或者:

    public object Get()
    {
        var listInt = new List<int>() { 1, 2 };
        var listString = new List<string>() { "a", "b" };
    
        return  new { listInt, listString };
    }
    

    还要记住XML 序列化程序不支持匿名类型。所以,你必须确保请求应该有标题:

    Accept: application/json
    

    为了接受json格式

    【讨论】:

    • 注意:request accept 必须是 application/json,因为 xml 序列化程序会响应错误,不知道该怎么做。
    【解决方案2】:

    你必须使用JsonNetFormatter序列化器,因为默认的序列化器——DataContractJsonSerializer不能序列化匿名类型。

    public HttpResponseMessage Get()
    {
        List<Customer> cust = GetCustomers();
        List<Products> prod= GetCustomers();
        //create an anonymous type with 2 properties
        var returnObject = new { customers = cust, Products= prod };
        return new HttpResponseMessage<object>(returnObject , new[] { new JsonNetFormatter() });
    }
    

    你可以从HERE获取JsonNetFormatter

    【讨论】:

    • 我在 HttpResponseMessage(还有 JsonNetFormatter,但我想我知道它们为什么在那里)上出现错误,说“非泛型类型 'System.Net.Http.HttpResponseMessage' 不能与类型参数”。有什么想法吗?
    【解决方案3】:

    而不是这个:

    return ControllerContext.Request
           .CreateResponse(HttpStatusCode.OK, new { listInt, listString });
    

    使用这个:

    return Ok(new {new List<int>() { 1, 2 }, new List<string>() { "a", "b" }});
    

    【讨论】:

    • 你也可以这样做:return Ok( new { listInt, listString });
    • 使用 ActionResult 作为控制器类中 action 方法的返回类型。
    猜你喜欢
    • 1970-01-01
    • 2016-09-09
    • 2021-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多