使用api发送复杂对象

时间:2015-11-25 14:34:19

标签: c# api

有很多主题,但没有什么对我有帮助。

我会告诉你我做了什么,你可以告诉我出了什么问题。

在api中,我想要从客户端发送复杂的对象:

    [HttpPost]
    public async Task Post([FromBody]string item)
    {
        WorkItem data = JsonConvert.DeserializeObject<WorkItem>(item);
        //...
    }

我如何发布复杂对象:

public async Task AddWorkItem()
{
    using (var client = HttpClientFactory.GetClient())
    {
        var item = new WorkItem()
        {
           Description = DateTime.Now.ToString("h:mm:ss tt"),
           Id = 11
        };

        var inner1 = new ItemUsage()
        {
            Id = 45,
            UsedFor = "something"
        };

        Collection<ItemUsage> Usage = new Collection<ItemUsage>();
        Usage.Add(inner1);

        item.Usage = Usage;

        string output = JsonConvert.SerializeObject(item);

        var response = await client.PostAsync("api/WorkItem", new StringContent(output));
        if (!response.IsSuccessStatusCode)
        {
            throw new Exception((int)response.StatusCode + "-" + response.StatusCode.ToString());
        }
    }

我收到错误:415-UnsupportedMediaType。 也许我的aproach不是最好的? 我需要一些干净的方式发布任何复杂的对象,我的想法是使用Json字符串。 你觉得怎么样?

3 个答案:

答案 0 :(得分:1)

您缺少WebAPI的一个主要功能,称为模型绑定或参数绑定。在调用Controller的Action之前,传入的数据绑定到Actions参数。换句话说,WebAPI管道将为您处理大多数反序列化。在您的示例中,您的参数类型是字符串,但您发送到服务器的内容无法转换为字符串。假设您的其他管道都很好,将参数类型更改为WorkItem应该可以解决问题。     public async Task Post([FromBody] WorkItem item) 如果必须接受字符串参数,则必须确保可以将请求的主体转换为字符串或编写自定义模型绑定器。 See here for more info on raw request body handling

答案 1 :(得分:0)

看起来问题是日期时间序列化。请参阅以下答案以获取帮助

JsonConvert.SerializeObject vs JsonSerializer.Serialize

答案 2 :(得分:0)

好的,现在我很清楚。我将添加整个代码,以便其他人可以使用它。

   [HttpPost]
        public async Task Post([FromBody]WorkItem item)
        {
            //No need to deserialize, you can use item here
        }

致电api:

 public async Task AddWorkItem()
        {
            using (var client = HttpClientFactory.GetClient())
            {
                //Complex object example::
                ///////////////////
                var item = new WorkItem()
                {
                    Description = DateTime.Now.ToString("h:mm:ss tt"),
                    Id = 11
                };

                var inner1 = new ItemUsage()
                {
                    Id = 45,
                    UsedFor = "something"
                };

                Collection<ItemUsage> Usage = new Collection<ItemUsage>();
                Usage.Add(inner1);

                item.Usage = Usage;
                ////////////////////////////
                var json = JsonConvert.SerializeObject(item);
                var content = new StringContent(json, UnicodeEncoding.UTF8, "application/json");
                var response = await client.PostAsync("api/WorkItem", content);
                if (!response.IsSuccessStatusCode)
                {
                    throw new Exception((int)response.StatusCode + "-" + response.StatusCode.ToString());
                }
            }
       }

创建客户

public static class HttpClientFactory
    {
        public static HttpClient GetClient()
        {
            HttpClient client = new HttpClient();
            client.BaseAddress = new Uri("http://localhost:1431");

            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(
                new MediaTypeWithQualityHeaderValue("application/json"));

            return client;
        }
    }