zoukankan      html  css  js  c++  java
  • C# 调用api的方法

    问题场景:

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

    代码如下:
    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; }
    }
    }

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

  • 相关阅读:
    (todo)数组名 有存储空间吗?
    c和指针 指针数组 关于指针数组
    c面试题 来自android手机 1/6
    c 和指针 二维数组赋予一维数组指针 数组长度 数组与指针长度区别
    c语言优先级面试小结
    hxf 每晚 宏 不用大于小于 求大小
    DelphiX中的DXSprite单元中涉及到修改
    在java开发过程中,添加表时,需要配置一下的目录和文件。
    代码生成器cs的注册方法.
    将一个字符串映射为一个Delphi页面控件属性名
  • 原文地址:https://www.cnblogs.com/damsoft/p/6062109.html
Copyright © 2011-2022 走看看