一、前言

      工作也有一年多了,从进入公司就一直进行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. Yii2 Gridview 动态显示行或列和action列

    我们知道Yii中的GridView组件是非常好用的. 某些情况要动态显示某列,这时候就要用到visible属性 'propString' => ['attribute' => 'prope ...

  2. Struts 2(五):输入校验 & 校验框架

    第一节 Struts2输入校验 1.1 输入校验的重要性 输入校验分为客户端校验和服务器端校验.客户端校验用来过滤用户的错误操作,一般使用JavaScript代码实现.服务器端校验用来防止非法用户的恶 ...

  3. 基于Cocos2d-x-1.0.1的飞机大战游戏开发实例(下)

    在飞机大战游戏开发中遇到的问题和解决方法: 1.在添加菜单时,我要添加一个有背景的菜单,需要在菜单pMenu中添加一个图片精灵,结果编译过了但是运行出错,如下图: 查了很多资料,调试了很长时间,整个人 ...

  4. hdu2061 Treasure the new start, freshmen!(暴力简单题)

    Treasure the new start, freshmen! Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/3276 ...

  5. moment.js使用方法总结

    Moment.js是一个轻量级的JavaScript时间库,它方便了日常开发中对时间的操作,提高了开发效率.日常开发中,通常会对时间进行下面这几个操作:比如获取时间,设置时间,格式化时间,比较时间等等 ...

  6. centos下JDK安装及环境变量配置

    由于centos安装自带openjdk,需要将其卸载后安装自己的jdk 卸载centos自带jdk 1.查找java :rpm -qa | grep java 2.卸载时提示权限不够,进入root目录 ...

  7. vue Map 渲染DOM

    遍历对象(map),以键值对k:v的形式渲染DOM (1)DOM (2)数据模板

  8. (python)剑指Offer 面试题51:数组中重复的数字

    问题描述 在长度为n的数组中,所有的元素都是0到n-1的范围内. 数组中的某些数字是重复的,但不知道有几个重复的数字,也不知道重复了几次,请找出任意重复的数字. 例如,输入长度为7的数组{2,3,1, ...

  9. 【第七章】MySQL数据库备份-物理备份

    一.数据库备份 备份的目的: 备份: 能够防止由于机械故障以及人为误操作带来的数据丢失,例如将数据库文件保存在了其它地方. 冗余: 数据有多份冗余,但不等备份,只能防止机械故障还来的数据丢失,例如主备 ...

  10. 两张神图介绍python3和 2.x与 3.x 的区别

    有感与第一张图, 做了第二张图.