webapi怎么调用?如何使用程序调用webApi接口?

在C#中,传统调用HTTP接口一般有两种办法:

1.WebRequest/WebResponse组合的方法调用

2.WebClient类进行调用。

第一种方法抽象程度较低,使用较为繁琐;而WebClient主要面向了WEB网页场景,在模拟Web操作时使用较为方便,但用在RestFul场景下却比较麻烦,在Web API发布的同时,.NET提供了两个程序集:System.Net.Http和System.Net.Http.Formatting。这两个程序集中最核心的类是HttpClient。

在.NET4.5中带有这两个程序集,而.NET4需要到Nuget里下载Microsoft.Net.Http和Microsoft.AspNet.WebApi.Client这两个包才能使用这个类,更低的.NET版本就只能表示遗憾了只能用WebRequest/WebResponse或者WebClient来调用这些API了。

在使用中,System.Net.Http这个程序集提供了HttpClient类以及相关的HTTP调用,而System.Net.Http.Formatting提供了一些针对HttpClient的帮助扩展,更好地支持了内容协商、Content创建等功能。

下面我就和大家一起写一下这个例子:

public class Person    {        public long Id { get; set; }        public string Name { get; set; }         public int Age { get; set; }         public string Sex { get; set; }         public override string ToString()        {            return $"Id={Id} Name={Name} Age={Age} Sex={Sex}";        }    }
class Program   {       static void Main(string[] args)       {           var client = new HttpClient();           //基本的API URL           client.BaseAddress = new Uri("http://localhost:22658/");           //默认希望响应使用Json序列化(内容协商机制,我接受json格式的数据)           client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));            //运行client接收程序           Run(client);           Console.ReadLine();       }       //client接收处理(都是异步的处理)       static async void Run(HttpClient client)       {           //post 请求插入数据           var result = await AddPerson(client);           Console.WriteLine($"添加结果:{result}"); //添加结果:true                      //get 获取数据           var person = await GetPerson(client);           //查询结果:Id=1 Name=test Age=10 Sex=F           Console.WriteLine($"查询结果:{person}");            //put 更新数据           result = await PutPerson(client);           //更新结果:true           Console.WriteLine($"更新结果:{result}");            //delete 删除数据           result = await DeletePerson(client);           //删除结果:true           Console.WriteLine($"删除结果:{result}");        }              //post       static async Task<bool> AddPerson(HttpClient client)       {           //向Person发送POST请求,Body使用Json进行序列化           return await client.PostAsJsonAsync("api/Person", new Person() { Age = 10, Id = 1, Name = "test", Sex = "F" })                                //返回请求是否执行成功,即HTTP Code是否为2XX                               .ContinueWith(x => x.Result.IsSuccessStatusCode);         }              //get       static async Task<Person> GetPerson(HttpClient client)       {           //向Person发送GET请求           return await await client.GetAsync("api/Person/1")            //获取返回Body,并根据返回的Content-Type自动匹配格式化器反序列化Body内容为对象                                    .ContinueWith(x => x.Result.Content.ReadAsAsync<Person>(                                                new List<MediaTypeFormatter>() {new JsonMediaTypeFormatter()/*这是Json的格式化器*/                                                   ,new XmlMediaTypeFormatter()/*这是XML的格式化器*/}));       }              //put       static async Task<bool> PutPerson(HttpClient client)       {           //向Person发送PUT请求,Body使用Json进行序列化           return await client.PutAsJsonAsync("api/Person/1", new Person() { Age = 10, Id = 1, Name = "test1Change", Sex = "F" })                                .ContinueWith(x => x.Result.IsSuccessStatusCode);  //返回请求是否执行成功,即HTTP Code是否为2XX       }       //delete       static async Task<bool> DeletePerson(HttpClient client)       {           return await client.DeleteAsync("api/Person/1") //向Person发送DELETE请求                              .ContinueWith(x => x.Result.IsSuccessStatusCode); //返回请求是否执行成功,即HTTP Code是否为2XX       }}

这就完成了这组API的调用,是不是非常简单方便?HTTPClient使用全异步的方法,并且他有良好的扩展性。

OK,到此为止一组简单的Restful API和C#的调用客户端就完成了,但这只是开始,Web API是一个很强大的框架,他的扩展点非常丰富,这些扩展能为我们的开发提供很多的帮助。

更多相关文章

  1. char是什么数据类型
  2. 数据结构排序算法总结
  3. c语言源程序的最小单位是什么
  4. c语言万年历程序代码
  5. c程序怎么编写x的y次方
  6. c语言程序是从源文件第一条语句开始执行的,这句话是错的吗
  7. c语言数据类型转换的方法
  8. c语言程序的调试方法
  9. c语言源程序文件的后缀是什么?

随机推荐

  1. MyBatis之Mapper XML 文件详解(五)-自动
  2. Spring入门这一篇就够了
  3. Spring【依赖注入】就是这么简单
  4. 面试官:知道ThreadLocal嘛?谈谈你对它的理
  5. Spring【AOP模块】就这么简单
  6. Springboot整合redis(Lettuce版本)
  7. Spring【DAO模块】知识要点
  8. 阿里的OceanBase数据库世界第一,底层原来
  9. Springboot整合Websocket实现后端向前端
  10. MyBatis之Mapper XML 文件详解(六)-缓存