开发者社区> 范大脚脚> 正文

ASP.NET MVC Web API Post FromBody(Web API 如何正确 Post)

简介:
+关注继续查看

问题场景:

ASP.NET MVC Web API 定义 Post 方法,HttpClient 使用 JsonConvert.SerializeObject 传参进行调用,比如 Web Api 中定义 AddProduct 方法,参数为 Product 的各类信息(id、name等),然后操作完之后返回处理信息。

问题分析:

曾经在之前写过一篇 Web API 的博文《初试ASP.NET Web API/MVC API(附Demo)》,但只是讲解了 Get 的用法,因为比较简单,通过 URL 就可以进行传参,比如 URL:http://localhost:9283/api/product/get/1 ,这个就表示在控制器 Product 中获取 ID 为 1 的 Product,客户端不需要配置什么,直接在 HttpClient 中传入这个 URL 就可以了。

Web API 中使用 Post 的方式可以参考《HttpClient + ASP.NET Web API, WCF之外的另一个选择》,我按照文中的方式试了下,代码如下:

ProductController 代码:

    public class ProductController : ApiController
    {

        [HttpPost]
        public int AddProduct(string id, string name)
        {
            return 1;
        }
    }

HttpClient 测试调用代码:

        [Fact]
        public void WebApiTest_AddProduct()
        {
            using (var client = new HttpClient())
            {
                client.BaseAddress = new Uri("http://localhost:1661/");

                var requestJson = JsonConvert.SerializeObject(
                    new
                    {
                        id = "1",
                        name = "2"
                    });

                HttpContent httpContent = new StringContent(requestJson);
                httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");

                var result = client.PostAsync("api/Product/AddProduct", httpContent).Result.Content.ReadAsStringAsync().Result;
            }
        }

MapHttpRoute 路由配置:

        public static void Register(HttpConfiguration config)
        {
            config.Routes.MapHttpRoute(
               name: "DefaultApi",
               routeTemplate: "api/{controller}/{action}/{id}",
               defaults: new { id = RouteParameter.Optional }
           );
        }

异常信息:

看起来似乎没什么问题,但为什么会抱“在控制器“Product”上找不到与该请求匹配的操作。”错误呢?从异常信息可以看出,应该是路由问题,也就是说找不到 Action-AddProduct,但是写的路由配置没什么问题啊(我自己认为),然后网上各种关键字搜索,找了很多资料,我也试了很多方式,因为对 WEB API 的路由配置不是很熟悉,然后新建 Demo,一点一点的进行测试,发现几个点,比如路由默认配置是没有 {action} 的,还有就是上面测试代码中 PostAsync,默认不知道为什么会当作 Get 使用,比如我们在 AddProduct 方法中去掉一个 name 参数,这时候我们测试会发现是执行 AddProduct,但是参数 id 变成了“AddProduct”,显然 action 的名字当作了 id 的值,这个我觉得有两个原因,一个是我路由配置没有配置好,还有就是测试客户端的代码写的有问题,因为急着解决这个问题,所以也没有研究这其中的原因,最后发现了 FromBody(只能标识一个),我之前在找问题的过程中,也是使用过它,但是当时并没有成功,现在也忘了当时的代码是怎么写的了。

记录一下 Post 可以运行的方式。

ProductController 代码:

    public class ProductController : ApiController
    {

        [HttpPost]
        public int AddProduct([FromBody] Product product)
        {
            return 1;
        }

        public class Product
        {
            public string id { get; set; }
            public string name { get; set; }
        }
    }

测试代码和路由配置没有变化,测试结果:

就记录到这里。


本文转自田园里的蟋蟀博客园博客,原文链接:http://www.cnblogs.com/xishuai/p/aspnet_mvc_web_api_httpclient_json_frombody_post.html,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
OpenJDK源码下载
OpenJDK 源码下载 地址 : hg.openjdk.java.net/ 在这里选择对应的 JDK 版本 点进来,就可以找到我们感兴趣的源码了 ,比如 最主要的就是这个 hotspot 虚拟机 , 还有 jdk 源码 其他文件夹的含义如下~ 可以跳过~ 目录讲解 CORBA CORBA(Common ObjectRequest Broker Architecture公共对象请求代理体系结构)是由 OMG 组织制订的一种标准的面向对象应用程序体系规范。或者说 CORBA 体系结构是对象管理组织(OMG)为解决分布式处理环境 (DCE) 中,硬件和软件系统的互连而提出的一种解决方案;
1 0
最近,深入研究了一下数据挖掘竞赛神器——XGBoost的算法原理和模型数据结构
从事数据挖掘相关工作的人肯定都知道XGBoost算法,这个曾经闪耀于数据挖掘竞赛的一代神器,是2016年由陈天齐大神所提出来的经典算法。本质上来讲,XGBoost算作是对GBDT算法的一种优化实现,但除了在集成算法理念层面的传承,具体设计细节其实还是有很大差别的。最近深入学习了一下,并简单探索了底层设计的数据结构,不禁感慨算法之精妙!聊作总结,以资后鉴!
3 0
CSS @property,让不可能变可能
CSS @property,让不可能变可能
5 0
Superset 0.37 发布——颜值最高的数据可视化平台
Superset 0.37 发布——颜值最高的数据可视化平台
5 0
最近,又发现了Pandas中三个好用的函数
对Pandas投入了很多精力,自认掌握的还算扎实,期间也总结分享了很多Pandas相关技巧和心得(点击上方“Pandas”标签可以查看系列文章)。近日,在github中查看一些他人提交的代码时,发现了Pandas中这三个函数,在特定场景中着实好用,遂成此文以作分享。
3 0
PyTorch学习系列教程:何为Tensor?
本文继续PyTorch学习系列教程,来介绍在深度学习中最为基础也最为关键的数据结构——Tensor。一方面,Tensor之于PyTorch就好比是array之于Numpy或者DataFrame之于Pandas,都是构建了整个框架中最为底层的数据结构;另一方面,Tensor又与普通的数据结构不同,具有一个极为关键的特性——自动求导。今天,本文就来介绍Tensor这一数据结构。
5 0
新时代布局中一些有意思的特性
新时代布局中一些有意思的特性
3 0
且用且珍惜:Pandas中的这些函数/属性将被deprecated
Pandas对于日常数据分析和处理来说是最常用的工具(没有之一),笔者之前也总结分享了很多相关用法和技巧。与之不同,今天本文来介绍几个已经在函数文档中列入"deprecated"的函数/属性,可能在不久的未来版本中这些用法将正式与我们告别,以此权当留念。
3 0
CSS 还能这样玩?奇思妙想渐变的艺术
CSS 还能这样玩?奇思妙想渐变的艺术
4 0
探秘神奇的运动路径动画 Motion Path
探秘神奇的运动路径动画 Motion Path
3 0
+关注
3656
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载