【问题标题】:Access Web API deserialization/serialization methods within controller body访问控制器主体内的 Web API 反序列化/序列化方法
【发布时间】:2014-01-02 20:14:35
【问题描述】:

有没有办法反序列化/序列化 JSON POST 内容/响应 Web API 控制器的主体中,其方式与控制器反序列化/序列化 JSON 内容的完全相同/response 是否是参数/显式类型?

我的动机是我正在尝试构建一个“神奇的”API 控制器,如果开发人员没有足够的时间构建强类型操作来访问它们,它可以快速提供对我的服务命令的访问。假设我有以下操作:

public Brownie Brownie(BrownieInputModel inputModel)
{
    ...
    var brownie = brownieService.GetBrownie(inputModel);
    return brownie;
}

public Pizza Pizza(PizzaInputModel inputModel)
{
    ...
    var pizza = pizzaService.GetPizza(inputModel);
    return pizza;
}

是否有可能做这样的事情(在伪代码中):

public object FoodStuff(string methodName)
{
    var inputModel = WebApi.Deserialize(Request.JsonContent); // <-- pseudo
    var serviceMethod = GetServiceMethodFromMethodName(methodName);
    var result = serviceMethod.Execute();
    return WebApi.Serialize(result); // <-- pseudo
}

【问题讨论】:

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


    【解决方案1】:

    我认为HttpRequestMessageHttpResponseMessage 类可以帮助您解决这个问题。使用它们,您的代码可能如下所示:

    public async Task<HttpResponseMessage> Post(
        string methodName, HttpRequestMessage request)
    {
        HttpResponseMessage response;
        switch (methodName)
        {
            case "brownie":
                response = await HandleBrownieAsync(request);
                break;
            case "pizza":
                response = await HandlePizzaAsync(request);
                break;
            default:
                throw new NotSupportedException();
        }
        return response;
    }
    
    private async Task<HttpResponseMessage> HandleBrownieAsync(HttpRequestMessage request)
    {
        var brownie = await GetRequestContentAsync<Brownie>(request);
        return await CreateJsonResponseAsync(brownie);
    }
    
    private async Task<HttpResponseMessage> HandlePizzaAsync(HttpRequestMessage request)
    {
        var pizza = await GetRequestContentAsync<Pizza>(request);
        return await CreateJsonResponseAsync(pizza);
    }
    
    private async Task<T> GetRequestContentAsync<T>(HttpRequestMessage request)
    {
        var contentString = await request.Content.ReadAsStringAsync();
        return await JsonConvert.DeserializeObjectAsync<T>(contentString);
    }
    
    private async Task<HttpResponseMessage> CreateJsonResponseAsync<T>(T content)
    {
        var response = new HttpResponseMessage(HttpStatusCode.OK)
        {
            Content = new StringContent(
                await JsonConvert.SerializeObjectAsync(content),
                Encoding.UTF8,
                "application/json")
        };
        return response;
    } 
    

    如果您使用这些简化模型:

    public class Brownie
    {
        public bool HasNuts { get; set; }
    }
    
    public class Pizza
    {
        public string CheeseType { get; set; }
    }
    

    然后你可以发出 POST 请求:

    网址http://api.url?methodName=brownie正文{"hasNuts":true}

    网址http://api.url?methodName=pizza正文{"cheeseType":"Mozzarella"}

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-03
      • 2014-05-24
      • 1970-01-01
      • 1970-01-01
      • 2014-05-23
      • 1970-01-01
      相关资源
      最近更新 更多