ASP.NET Web Api 实践系列(二)Get/Post方式调用Web Api

本文给出Get/Post方式访问Web Api的帮助方法,对于Put/Delete方式的调用跟Post调用类似。

一、Web Api调用帮助类

下面给出Web Api调用帮助类的代码:

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Net.Http;
  4 using System.Net.Http.Headers;
  5 using System.Text;
  6 using System.Web;
  7
  8 namespace TestApi
  9 {
 10     /// <summary>
 11     /// WebApi访问帮助类
 12     /// </summary>
 13     public class WebApiHepler
 14     {
 15         /// <summary>
 16         /// 生成最终URL
 17         /// </summary>
 18         /// <param name="baseUrl">基准URL(不含查询串)</param>
 19         /// <param name="dictParam">查询参数字典</param>
 20         /// <returns>最终URL</returns>
 21         private static string GetLastUrl(string baseUrl, Dictionary<string, string> dictParam)
 22         {
 23             var sbUrl = new StringBuilder(baseUrl);
 24             if (dictParam != null && dictParam.Count > 0)
 25             {
 26                 sbUrl.Append("?");
 27                 int index = 0;
 28                 foreach (var item in dictParam)
 29                 {
 30                     sbUrl.Append(string.Format("{0}={1}", item.Key,
 31                         HttpUtility.UrlEncode(item.Value, Encoding.UTF8)));
 32                     if (index < dictParam.Count - 1)
 33                     {
 34                         sbUrl.Append("&");
 35                     }
 36                     index++;
 37                 }
 38             }
 39             var url = sbUrl.ToString();
 40             return url;
 41         }
 42
 43         /// <summary>
 44         /// GET方式调用Web Api
 45         /// </summary>
 46         /// <param name="baseUrl">基准URL(不含查询串)</param>
 47         /// <param name="dictParam">查询参数字典</param>
 48         /// <param name="result">返回数据(Json格式)</param>
 49         /// <param name="errMsg">出错信息</param>
 50         /// <returns>成功与否</returns>
 51         public static bool Get(string baseUrl, Dictionary<string, string> dictParam, out string result, out string errMsg)
 52         {
 53             errMsg = string.Empty;
 54             result = string.Empty;
 55             try
 56             {
 57                 using (var client = new HttpClient())
 58                 {
 59                     client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
 60                     var url = GetLastUrl(baseUrl, dictParam);
 61                     var tmpResult = client.GetAsync(url).Result;
 62                     tmpResult.EnsureSuccessStatusCode();
 63                     result = tmpResult.Content.ReadAsStringAsync().Result;
 64                     return true;
 65                 }
 66             }
 67             catch (Exception ex)
 68             {
 69                 errMsg = ex.Message;
 70                 return false;
 71             }
 72
 73         }
 74
 75         /// <summary>
 76         /// POST方式调用Web Api
 77         /// </summary>
 78         /// <param name="baseUrl">基准URL(不含查询串)</param>
 79         /// <param name="dictParam">查询参数字典</param>
 80         /// <param name="parseData">传递实体数据(Json格式)</param>
 81         /// <param name="result">返回数据(Json格式)</param>
 82         /// <param name="errMsg">出错信息</param>
 83         /// <returns>成功与否</returns>
 84         public static bool Post(string baseUrl, Dictionary<string, string> dictParam, string parseData, out string result, out string errMsg)
 85         {
 86             errMsg = string.Empty;
 87             result = string.Empty;
 88             try
 89             {
 90                 using (var client = new HttpClient())
 91                 {
 92                     client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
 93                     var url = GetLastUrl(baseUrl, dictParam);
 94                     var content = new StringContent(parseData, Encoding.UTF8);
 95                     content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
 96                     var tmpResult = client.PostAsync(url, content).Result;
 97                     tmpResult.EnsureSuccessStatusCode();
 98                     result = tmpResult.Content.ReadAsStringAsync().Result;
 99                     return true;
100                 }
101             }
102             catch (Exception ex)
103             {
104                 errMsg = ex.Message;
105                 return false;
106             }
107         }
108     }
109 }

二、部分说明

对以上的代码作部分说明:

  • GetLastUrl方法用于根据基准URL和查询参数字典获取最终URL
  • client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));这句代码表示希望服务返回Json字符串。
  • content.Headers.ContentType = new MediaTypeHeaderValue("application/json"); 表示以Json格式传递实体内容。
时间: 2024-12-07 04:48:56

ASP.NET Web Api 实践系列(二)Get/Post方式调用Web Api的相关文章

ASP.NET Web API实践系列04,通过Route等特性设置路由

ASP.NET Web API路由,简单来说,就是把客户端请求映射到对应的Action上的过程.在"ASP.NET Web API实践系列03,路由模版, 路由惯例, 路由设置"一文中,体验了通过模版.惯例.HTTP方法来设置路由,这种做法的好处是把路由模版统一放在了App_Start文件夹下的WebApiConfig类中,方便管理,但缺点是不够灵活. REST把一切都看成资源,有时候,一个资源连带子资源,比如Customer和Orders密切关联,我们可能希望输入这样的请求:cust

ASP.NET Web API实践系列05,消息处理管道

ASP.NET Web API的消息处理管道可以理解为请求到达Controller之前.Controller返回响应之后的处理机制.之所以需要了解消息处理管道,是因为我们可以借助它来实现对请求和响应的自定义处理.所有的请求被封装到HttpRequestMessage这个类中,所有的响应被封装到HttpResponseMessage这个类中. 既然消息处理管道是可扩展的,那么,ASP.NET Web API一定为我们准备了便于扩展的接口或抽象类,它就是HttpMessageHandler抽象类.

ASP.NET Web API实践系列07,获取数据, 使用Ninject实现依赖倒置,使用Konockout实现页面元素和视图模型的双向绑定

本篇接着上一篇"ASP.NET Web API实践系列06, 在ASP.NET MVC 4 基础上增加使用ASP.NET WEB API",尝试获取数据. 在Models文件夹下创建Comment类: namespace MvcApplication5.Models { public class Comment { public int ID { get; set; } public string Author { get; set; } public string Text { ge

基于JDK7 NIO2的高性能web服务器实践之二(转)

前一篇博客,我简单提了下怎么为NIO2增加TransmitFile支持,文件传送吞吐量是一个性能关注点,此外,并发连接数也是重要的关注点. 不过JDK7中又一次做了简单的实现,不支持同时投递多个AcceptEx请求,只支持一次一个,返回后再投递.这样,客户端连接的接受速度必然大打折扣.不知道为什么sun会做这样的实现,WSASend()/WSAReceive()一次只允许一个还是可以理解,毕竟简化了编程,不用考虑封包乱序问题.也降低了内存耗尽的风险.AcceptEx却没有这样的理由了. 于是再一

C# 互操作性入门系列(二):使用平台调用调用Win32 函数

好文章搬用工模式启动ing ..... { 文章中已经包含了原文链接 就不再次粘贴了 言明 改文章是一个系列,但只收录了2篇,原因是 够用了 } --------------------------------------------------------------------------------------- C#互操作系列文章: C#互操作性入门系列(一):C#中互操作性介绍 C#互操作性入门系列(二):使用平台调用调用Win32 函数 C#互操作性入门系列(三):平台调用中的数据封

ASP.NET Web Api 实践系列(一)自我寄宿

从今天开始,研究ASP.NET Web Api(以下有时会简称Web Api).我会写一个实践系列专题,不一定成理论体系,只是遇到问题或心得,记下来.争取用一段较长的时间对ASP.NET Web Api有个较深入的理解.这里我是使用VS2013集成开发环境,如果版本不够,可以用NuGet去下载Web Api相关dll. 今天讨论自我寄宿Web Api. Web Api继承了WCF的优点,除了常规的Web寄宿(IIS)外,还可以在NET的控制台.WinForms等程序中寄宿.这里讲一讲在控制台中寄

Asp.Net Web API 2第三课——.NET客户端调用Web API

Asp.Net Web API 导航 Asp.Net Web API第一课——入门http://www.cnblogs.com/aehyok/p/3432158.html Asp.Net Web API第二课——CRUD操作http://www.cnblogs.com/aehyok/p/3434578.html 前言 本教程演示从一个控制台应用程序,使用HttpClient调用Web API.我们也将使用上一个教程中建立的Web API.你可以直接在http://www.cnblogs.com/

[ 搭建Redis本地服务器实践系列二 ] :图解CentOS7配置Redis

上一章 [ 搭建Redis本地服务器实践系列一 ] :图解CentOS7安装Redis 详细的介绍了Redis的安装步骤,那么只是安装完成,此时的Redis服务器还无法正常运作,我们需要对其进行一些配置,这个章节我们重点来讲解下如何对Redis配置文件进行配置才能顺利的启动Redis服务. 要了解Reids的配置项,我们需要先来认识一个脚本文件redis_init_script,从名字我们就能看出来,他就是Redis的初始化脚本,那么这个脚本文件长什么样子,里面有什么内容,又该怎么找到他呢?哈哈

ASP.NET Web API实践系列02,在MVC4下的一个实例, 包含EF Code First,依赖注入, Bootstrap等

本篇体验在MVC4下,实现一个对Book信息的管理,包括增删查等,用到了EF Code First, 使用Unity进行依赖注入,前端使用Bootstrap美化.先上最终效果: →创建一个MVC4项目,选择Web API模版. →在Models文件夹创建一个Book.cs类. namespace MyMvcAndWebApi.Models { public class Book { public int Id { get; set; } public string Name { get; set