C# WebAPI系列(2)
上篇中简单介绍了一下WebApi,本章主要介绍一下Controller相关的知识。
在实际应用中,Controller是WebAPI的链接服务器和客户端的窗口。Controller的好坏影响整个系统的设计。Controller中是各种Action接口,对于Action接口,我们有必要对其接收的参数和返回值了解。
Action返回类型
WebAPI服务函数的返回值主要可以分为void、普通对象、HttpResponseMessag、IHttpActionResult 四种,这里简单的介绍一下。
Void类型
一般来说,Delete和Put类型的求情返回void类型的值,如:
public class DepartmentController : ApiController
{
public void Delete(int id)
{ }
}
不过一个交互性好的接口,应该返回正确的Http status code,如返回200,对列子做修改:
public class DepartmentController : ApiController
{
public HttpStatusCode Delete(int id)
{
return HttpStatusCode.OK;
}
}
普通对象
普通对象通常是由Get接口返回。例如:
public class CompanyController : ApiController
{
public Company Get(int id)
{
return CompanyInfo;
}
}
HttpResponseMessag
HttpResponseMessage是标准Http应答了,此时服务器并不做任何处理,可以直接将HttpResponseMessage发送给客户端。
public HttpResponseMessage Get()
{
var response = Request.CreateResponse(HttpStatusCode.OK);
response.Content = new StringContent("Success", Encoding.UTF8); return response;
}
IHttpActionResult
IHttpActionResult是Web API 2中引入的一个接口,IHttpActionResult是HttpResponseMessage的一个工厂类。IHttpActionResult是WebAPI中推荐的标准返回值,ApiController类中也提供了不少标准的工厂函数方便我们快速构建它们,如BadRequest,Conflict,Ok,NotFound等,一个简单的示例如下:
public IHttpActionResult Get(int id)
{
var dto = new ProductDataDTO();
dto = AutoMapper.Mapper.Map<ProductDataDTO>(ProductDataService.QueryProductData (id));
return Ok(dto);
}
Action参数类型
Get请求的参数,均在URI中给出,比较简单,不做过多说明。下面主要对POST请求的参数做一下说明。
POST请求
单一POST参数
单一的参数请求,需要使用[FromBody]标记参数,如下图所示:
[AcceptVerbs("POST")]
public string Post([FromBody]string data)
{
return string.Format(@"Data:{1}", data);
}
除了使用[FromBody]标记参数外,也可以使用dynamic关键字标记参数。
多个参数的POST请求
有了上面的经验,多个参数的例子,按照常理来说,应该如下所示:
[AcceptVerbs("POST")]
public string Post([FromBody]string data, [FromBody]string name)
{
return string.Format(@"Name:{0},Data:{1}", name, data);
}
但在实际调用中却报错,报错如下:

查了资料,原因是在一个接口中,被[FromBody]修饰的参数只能有一个。对此,我们可以将上面的两个参数封装为一个对象传递。如下:
public class Person
{
public string name { set; get; }
public string message { set; get; }
} ...... [AcceptVerbs("POST")]
public string TEST4([FromBody]Person data)
{
return string.Format(@"Name:{0},Message:{1}", data.name, data.message);
}
除此之外,还有另外一种方式实现,使用[FromURi]关键字,如下所示:
public string TEST2([FromUri]string data,[FromBody]string name)
{
return string.Format(@"Name:{0},Data:{1}",name,data);
}
需要说明的是,在WebApi的接口参数中,在没有标记的情况下,参数默认是[FromUri]形式,Get请求的接口的参数都是FromUri,顾名思议是从Uri获取数据。一个接口可以有多个FromUri参数(这些参数一般都是简单参数),但是只能有一个FromBody的参数。
就刚才的例子而言,data数据在Uri中获取,而name数据则从body中获取。
传递对象
有了上面的例子,其实传递对象在上面已经讲过了,就是使用[FromBody]或dynamic标记参数。
传递不同的多个对象
这种情况,最近打算写这篇文章的时候,查找资料的时候,在其他人的博文中看到的,地址如下:http://www.cnblogs.com/babycool/p/3922738.html,里面提到了传递多个不同对象的情况,个人也尝试去试着调试,但是一直没有成功,也就不好做过多的说明。后来想了下,其实可以另辟蹊径解决这个方法,新建一个对象,将要传递的对象做了属性,这样来传递给后台接口。关于最后这种方式,大家感兴趣可以去看看原文。
C# WebAPI系列(2)的更多相关文章
- WebApi系列~目录
回到占占推荐博客索引 写了这个系列的文章不少了,也应该为大家写个目录了,最近很刮了很多SOA的风,很多企业都将自己的系统进行分割,通常是按模块进行拆分,为这个模块提供统一的接口提供业务服务,这不紧可以 ...
- Http下的各种操作类.WebApi系列~通过HttpClient来调用Web Api接口
1.WebApi系列~通过HttpClient来调用Web Api接口 http://www.cnblogs.com/lori/p/4045413.html HttpClient使用详解(java版本 ...
- 【WebApi系列】浅谈HTTP
[01]浅谈HTTP在WebApi开发中的运用 [02]聊聊WebApi体系结构 [03]详解WebApi如何传递参数 [04]详解WebApi测试和PostMan [05]浅谈WebApi Core ...
- 【WebApi系列】详解WebApi如何传递参数
WebApi系列文章 [01]浅谈HTTP在WebApi开发中的运用 [02]聊聊WebApi体系结构 [03]详解WebApi参数的传递 [04]详解WebApi测试和PostMan [05]浅谈W ...
- 【WebApi系列】浅谈HTTP在WebApi开发中的运用
WebApi系列文章 [01]浅谈HTTP在WebApi开发中的运用 [02]聊聊WebApi体系结构 [03]详解WebApi参数的传递 [04]详解WebApi测试和PostMan [05]浅谈W ...
- WebApi系列知识总结
WebApi系列知识 一.webApi项目搭建 1.新建WebApi项目 (1) (2) (3) (4) Areas – HelpPage – App_Start – HelpPageConfig.c ...
- ASP.NET Core 2.2 WebApi 系列【九】使用SignalR (作者:tenghao510 ) 学习及内容补充
原文地址: ASP.NET Core 2.2 WebApi 系列[九]使用SignalR 今天,看到了大牛的这篇博文, 发了一下评论, 我很惊喜, 没想到他很快就回复了我, 而且通过QQ帮助了S ...
- VS Code WebApi系列——2、jwt结合数据库校验
Knowledge should be shared free. 我们都知道WebApi最重要的作用就是为外部服务提供相应的数据接口和服务,所以一般WebApi都会连接后台数据库,那么最重要的一件事就 ...
- WebApi系列(从.Net FrameWork 到 .Net Core)
一. 简介 1. 什么是WebApi? WebApi是一个很广泛的概念,在这里我们特指.Net平台下的Asp.Net WebApi框架,它是针对各种客户端(浏览器.APP等)来构建Http服务的一个 ...
- WebApi系列~StringContent与FormUrlEncodedContent
回到目录 知识点 本文是一个很另类的文章,在项目中用的比较少,但如果项目中真的出现了这种情况,我们也需要知道如何去解决,对于知识点StringContent和FormUrlEncodedContent ...
随机推荐
- nginx+lua+kafka 编写 在线日志上报系统
案例一 rewrite_by_lua ' --引入openresty自带的json处理对象 local cjson = require("cjson") local produce ...
- 2018-2019-20175302实验二《Java面向对象程序设计》实验报告
2018-2019-2 学号实验二<Java面向对象程序设计>实验报告 一.实验步骤及内容 1. 面向对象程序设计 参考 http://www.cnblogs.com/rocedu/p/6 ...
- JS——按钮点击事件累加注册问题
最近在工作上遇到一个点击事件累加的问题,为元素添加点击事件效果,但是总是效果失败,最后发现点击事件被执行了多次,上网查了一下,下边就是解决这个问题的几种思路 案列引自 踮起脚尖眺望6 $(" ...
- selenium启动谷歌浏览器
谷歌浏览器可以是任意版本. 根据谷歌浏览器的版本,下载响应的浏览器驱动(百度:谷歌驱动与谷歌浏览器版本映射表). 我用的是win7 ,下载win32就行了.下载解压之后可以放在python的安装目录下 ...
- Ubuntu16.04 静态IP设置
为VMware虚拟机内安装的Ubuntu 16.04设置静态IP地址NAT方式 1.安装环境 VMware 12 Ubuntu 16.04 x86_64 2.在VMware中,配置网络环境 VMwar ...
- File初识和练习
目录 File类 File对象的构建 File文件名.路径的获取 文件的状态 文件的其他操作 创建文件夹 列出下一级 实战练习1:列出子孙级目录及名称 实战练习2:列出文件及其子孙文件的总大小 实战练 ...
- 团队Scrum冲刺阶段-Day 6
选择困难症的福音--团队Scrum冲刺阶段-Day 6 今日进展 编写提问部分 游戏分类的界面全部写完了!!!! 临时大家决定没有BGM的app不是一个完整的app,所以在大家共同学习的努力下,听完四 ...
- HDU 6041.I Curse Myself 无向仙人掌图
I Curse Myself Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) ...
- sparse_matrix
(1)ndarray 与 scipy.sparse.csr.csr_matrix 的互转 import numpy as npfrom scipy import sparse 1.1 ndarry 转 ...
- JAVA实训第三次作业
编写"学生"类及其测试类. 5.1 "学生"类: 类名:Student 属性:姓名.性别.年龄.学号.5门课程的成绩 方法1:在控制台输出各个属性的值. 方法2 ...