c# - 在 Controller 体内访问 Web API 反序列化/序列化方法

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

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

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

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
}

最佳答案

我认为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请求:

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

URL:http://api.url?methodName=pizza主体:{"cheeseType":"Mozzarella"}

关于c# - 在 Controller 体内访问 Web API 反序列化/序列化方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20593974/

相关文章:

c# - ControlBuilder 实现的通用 DropDown 丢失了所有属性

C# Web API POST 时出现错误 404

c# - 如何在不区分大小写的情况下检查 Hunspell 中的拼写

python - 为什么单引号( ' ) and double quote( ")在 python 的 json 模块中得到不同的结果?

javascript - 一个棘手的javascript问题

c# - 如何使用 URI 片段在 C# 中签署 XML

php - 通过 cURL 访问 import.io API 时无法获取 JSON 结果中的实际 html

python - 使用 Pandas 将 csv 转换为 Json

winforms - c# TypeConverter 和 InstanceDescriptor 的痛苦

mysql - 需要知道MySQL数据库中保存的字节数组的类