C# 调用api的方法

Posted 晓明的哥哥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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; }
}
}

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

以上是关于C# 调用api的方法的主要内容,如果未能解决你的问题,请参考以下文章

onActivityResult 未在 Android API 23 的片段上调用

导航到另一个片段时触发 API 调用

对“xxx”类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们。 错误解决一例。(代码片段

C#常用代码片段备忘

我们可以在不使用 SAS 令牌的情况下通过 c# 代码调用 Azure API 管理吗

onActivityResult() 未在新的嵌套片段 API 中调用