一、前言

      工作也有一年多了,从进入公司就一直进行BIM(建筑信息模型)C/S产品的研发,平时写的最多的就是Dev WPF。一个偶然的时机,产品需要做支付宝扫码与微信扫码,所以需要了解产品服务器中的授权服务是如何编写的,以此开始接触Web。本篇将以小白的视角学习Webapi,老司机可以直接略过。

二、Webapi编写

        Step1:  编写WebApiConfig.cs,这个不用多说,就是设置路由嘛。

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

Step2:  在Global.asax文件中初始化路由映射。

public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
WebApiConfig.Register(GlobalConfiguration.Configuration);
}
}

Step3:  创建controller,编写Api具体服务。

public class TestController: ApiController
{
[HttpGet]
       public string ConnectionTest()
       {
            return "connected_success";
       } [HttpPost]
       public HttpResponseMessage GetInfo(string value1, string value2)
       {          
            var info = new Info()
            {
               Property1 = value1,
Property2 = value2,
Property3 = "3"
            };
            HttpResponseMessage response = new HttpResponseMessage
            {
                StatusCode = HttpStatusCode.OK,
                Content = new StringContent(JsonConvert.SerializeObject(info), Encoding.GetEncoding("UTF-8"),"application/json")
            };
            return response;
      }
}

这样,一个简单的实例就编写好了。根据之前的路由映射规则:"api/{controller}/{action}/{id}",我们的访问地址就是:http://xxx.xxx.com:xxx/api/Test/GetName

三、Webapi的请求

       api写完了,总要去请求这个api服务的吧,那么我们得首先明白HttpGet与HttpPost两种请求方式的区别。从字面上来说,Get是获取,Post是投递、推送的意思。结合其它资料我觉得以下解释还是比较容易理解的:

下面就是两种请求方式的写法,包括前台与后台的写法。前台以ajax,后台就是C#。

         Method1: Get请求写法

         前台Get请求写法:

//无参数
$.ajax({
url: "/api/controllerName/ActionName
type: "GET",
success: function (data)
{
//
}
}) //带参数
$.ajax({
url: "/api/controllerName/ActionName
type: "GET",
data:{"property1":value1,"property2":value2},
success: function (data)
{
//
}
}) 或者 $.ajax({
url: "/api/controllerName/ActionName/?property1="+value1+"&property2="+value2,
type: "GET",
success: function (data)
{
//
}
})

后台Get请求写法:

public static void TestGet(string serverAddress)
{
try
{
HttpClient httpsClient = new HttpClient
{
BaseAddress = new Uri(serverAddress),
Timeout = TimeSpan.FromMinutes()
}; if (DsClientOperation.ConnectionTest(httpsClient)) //这里是连接测试判断,可根据业务自行调整
{
stringGetUrl = httpsClient.BaseAddress + "api/ControllerName/ActionName"; //若带参,参数写在url里,例:xxx.com?order=参数1
Uri address = new Uri(PostUrl);
Task<HttpResponseMessage> response = httpsClient.GetAsync(address);
response.ContinueWith(
(getTask) =>
{
if (getTask.IsFaulted)
{
throw getTask.Exception;
}
HttpResponseMessage getResponse = getTask.Result;
getResponse.EnsureSuccessStatusCode();
var result = getResponse.Content.ReadAsStringAsync().Result;
return result;
});
}
}
catch
{ }
}
 public static bool ConnectionTest(string serverAddress)
{
if (string.IsNullOrEmpty(serverAddress)) return false;
HttpClient httpClient = new HttpClient
{
BaseAddress = new Uri(serverAddress),
Timeout = TimeSpan.FromSeconds()
}; Uri address = new Uri(httpClient.BaseAddress + "api/Test/ConnectionTest");
Task<HttpResponseMessage> task = httpClient.GetAsync(address);
try
{
task.Wait();
}
catch
{
return false;
} HttpResponseMessage response = task.Result;
if (!response.IsSuccessStatusCode)
return false; string connectionResult;
try
{
var result = response.Content.ReadAsStringAsync().Result;
connectionResult = JsonConvert.DeserializeObject<string>(result);
}
catch
{
return false;
}
return connectionResult.Equals("connected_success");
}

Method2: Post请求写法

前台Post请求写法:

//无参数
$.ajax({
url: "api/ControllerName/ActionName",
type: "Post",
success: function (data) { }
}); //有1个参数
$.ajax({
url: "api/ControllerName/ActionName",
type: "Post", dataType: "json",
contentType: "application/json",
data:{"":value1},
success: function (data) { } }); //有2个参数
$.ajax({
url: "api/ControllerName/ActionName",
type: "Post",
dataType: "json",
contentType: "application/json",
data:JSON.stringify({"property1":value1,"property2":value2}), success: function (data) { } });
//再多的话要封装成对象进行传输了
最重要的是Action里的参数有[FromBody]标签,并且FromBody只能写一次
[HttpPost]
public HttpResponseMessage Action([FromBody]dynamic yourparameter)
[HttpPost]
public HttpResponseMessage Action([FromBody]JObject yourparameter)

后台Post请求写法:

public static void TestPost(string productName, string serverAddress)
{
var productName = "Your Product";
var requestCode = "Your Number";
var clientDictionary = new Dictionary<string, string>
{
{"ProductName", productName},
{"RequestCode", requestCode},
}; var packageInfo = JsonConvert.SerializeObject(clientDictionary);
if (!string.IsNullOrEmpty(packageInfo))
{
try
{
HttpClient httpsClient = new HttpClient
{
BaseAddress = new Uri(serverAddress),
Timeout = TimeSpan.FromMinutes()
}; if (DsClientOperation.ConnectionTest(httpsClient)) //这里是连接测试判断,可根据业务自行调整
{
StringContent strData = new StringContent(
packageInfo,
Encoding.UTF8,
"application/json");
string PostUrl = httpsClient.BaseAddress + "api/ControllerName/ActionName";
Uri address = new Uri(PostUrl);
Task<HttpResponseMessage> response = httpsClient.PostAsync(address, strData);
response.ContinueWith(
(postTask) =>
{
if (postTask.IsFaulted)
{
throw postTask.Exception;
}
HttpResponseMessage postResponse = postTask.Result;
postResponse.EnsureSuccessStatusCode();
var result = postResponse.Content.ReadAsStringAsync().Result;
return result;
});
}
}
catch
{ }
}
}

四、结尾

       大致就写到这里,如果有写错的地方可以在评论区留言,下一篇玩玩其它的,继续以小白视角研究研究MVC。

【WebAPI】新手入门WebAPI的更多相关文章

  1. 基于flask的轻量级webapi开发入门-从搭建到部署

    基于flask的轻量级webapi开发入门-从搭建到部署 注:本文的代码开发工作均是在python3.7环境下完成的. 关键词:python flask tornado webapi 在python虚 ...

  2. ASP.NET Core WebAPI 开发-新建WebAPI项目 转

    转 http://www.cnblogs.com/linezero/p/5497472.html ASP.NET Core WebAPI 开发-新建WebAPI项目   ASP.NET Core We ...

  3. 新手入门指导:Vue 2.0 的建议学习顺序

    起步 1. 扎实的 JavaScript / HTML / CSS 基本功.这是前置条件. 2. 通读官方教程 (guide) 的基础篇.不要用任何构建工具,就只用最简单的 <script> ...

  4. Flume NG Getting Started(Flume NG 新手入门指南)

    Flume NG Getting Started(Flume NG 新手入门指南)翻译 新手入门 Flume NG是什么? 有什么改变? 获得Flume NG 从源码构建 配置 flume-ng全局选 ...

  5. 原创:从零开始,微信小程序新手入门宝典《一》

    为了方便大家了解并入门微信小程序,我将一些可能会需要的知识,列在这里,让大家方便的从零开始学习:一:微信小程序的特点张小龙:张小龙全面阐述小程序,推荐通读此文: 小程序是一种不需要下载.安装即可使用的 ...

  6. 【原创】新手入门一篇就够:从零开发移动端IM

    一.前言 IM发展至今,已是非常重要的互联网应用形态之一,尤其移动互联网时代,它正以无与论比的优势降低了沟通成本和沟通代价,对各种应用形态产生了深远影响. 做为IM开发者或即将成为IM开发者的技术人员 ...

  7. 课程上线 -“新手入门 : Windows Phone 8.1 开发”

    经过近1个月的准备和录制,“新手入门 : Windows Phone 8.1 开发”系列课程已经在Microsoft 虚拟学院上线,链接地址为:http://www.microsoftvirtuala ...

  8. WordPress建站 新手入门

    WordPress建站 新手入门教程系列 1. WordPress入门 之 什么是WordPress? 2. WordPress入门 之 搭建WordPress站点需要什么条件? 3. WordPre ...

  9. ASP.NET Core WebAPI 开发-新建WebAPI项目

    ASP.NET Core WebAPI 开发-新建WebAPI项目, ASP.NET Core 1.0 RC2 即将发布,我们现在来学习一下 ASP.NET Core WebAPI开发. 网上已经有泄 ...

随机推荐

  1. scrapy 爬取知乎问题、答案 ,并异步写入数据库(mysql)

      python版本  python2.7 爬取知乎流程: 一 .分析 在访问知乎首页的时候(https://www.zhihu.com),在没有登录的情况下,会进行重定向到(https://www. ...

  2. TensorFlow深度学习实战---图像数据处理

    图像的亮度.对比度等属性对图像的影响非常大,这些因素都会影响最后的识别结构.当然,复杂的预处理过程可能会导致训练效率的下降(利用TensorFlow中多线程处理输入数据的解决方案). 同一不同的原始数 ...

  3. JUC——原子类操作(三)

    原子类操作 既然强调了并发访问,那么就必须考虑操作系统位数:32位操作系统还是64位操作系统,对于long型数据类型而言,是64位的.但是如果现在项目运行在32位系统上,则long型数据会占用32位空 ...

  4. NO.07--我跟“ 币乎 ”的那些事

    文章开头给大家安利一款app吧,就是我标题提到的,‘币乎’,一个近似于虚拟货币的论坛吧,大家可以下载试试,发文章点赞赚钱,... 好了,开始说一说今天的正题吧: 这些事情说起来其实挺惭愧的,但也不是什 ...

  5. python终端计算器,还有没其他方法?

    import sysdef lt(a, b, c ): if b == "+": return int(a)+int(c) elif b == "-": ret ...

  6. Linux系统服务(daemon)(鸟哥Linux私房菜笔记)

    Linux系统服务(daemon) 一.SystemV的init管理机制(脚本式启动)1.服务启动分类stand alone 独立启动模式super daemon 总管程序 2.服务的启动.关闭与观察 ...

  7. 常用monkey_app稳定性

    Monkey稳定性测试 1       前言 为方便快速上手Monkey测试相关问题,针对测试中发现的Monkey问题进行了整理总结,供定位Monkey参考. 2       关于Monkey测试 2 ...

  8. 136.只出现一次的数字 leetcode ^运算符 JavaScript解法

    leetcode上的一道题简单题 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次.找出那个只出现了一次的元素. 说明: 你的算法应该具有线性时间复杂度. 你可以不使用额外空间 ...

  9. python—退出ipython3的help()

    退出ipython3的help() 组合键:ctrl+z

  10. 剑指 Offer——和为 S 的两个数字

    1. 题目 2. 解答 由于数组是已经排好序的,我们可以定义两个指针,第一个指针指向第一个元素,第二个指针指向最后一个元素,然后求出这两个元素的和,与目标和进行比较.若小于目标和,第一个指针向前移动: ...