WebApi入门
饮水思源
http://www.cnblogs.com/guyun/p/4589115.html
http://www.cnblogs.com/chutianshu1981/p/3288796.html
Web Api 的优点
关于Web Api的描述,就不在赘述,下面一张偷过来的图,清晰的表明了 Web Api 的优点

什么时候使用Web Api
- 需要Web Service但是不需要SOAP
 - 需要在已有的WCF服务基础上建立non-soap-based http服务
 - 只想发布一些简单的Http服务,不想使用相对复杂的WCF配置
 - 发布的服务可能会被带宽受限的设备访问
 - 希望使用开源框架,关键时候可以自己调试或者自定义一下框架
 
开始学习
为了证明 WEB API 的平台无关性质,下面将 以
Java和C#代码 共同请求一个C#写的 Web Api
搭建 WebApi
Step 1 建立项目

Step2 选择模板

Step 3 建立一个PersonModel类 在 Model 文件夹下 用于模拟一些数据
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace DemoWebApi.Models
{
    /// <summary>
    /// Person 类 用于模拟一些数据
    /// </summary>
    public class PersonModel
    {
        public string IdNumber { get; set; }
        public string Name { get; set; }
        public string Gender { get; set; }
        public string Address { get; set; }
    }
}
Step 4 建立一个控制器命名为 PersonController

Step 5: 了解控制器中的方法
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
namespace DemoWebApi.Controllers
{
    public class PersonController : ApiController
    {
        // GET: api/Person
        public IEnumerable<string> Get()
        {
            return new string[] { "value1", "value2" };
        }
        // GET: api/Person/5
        public string Get(int id)
        {
            return "value";
        }
        // POST: api/Person
        public void Post([FromBody]string value)
        {
        }
        // PUT: api/Person/5
        public void Put(int id, [FromBody]string value)
        {
        }
        // DELETE: api/Person/5
        public void Delete(int id)
        {
        }
    }
}
| HTTP请求的方法 | 在 WebApi 中的用途 | 
|---|---|
| GET | 用于查询 | 
| POST | 用于添加 | 
| PUT | 用于更新 | 
| DELETE | 用于删除 | 
完成WebApi
修改方法的命名
我想控制器中的方法名,我并不希望他们就是简单的Get Put 等。我希望给他们换一个更加容易理解的名字。
使用 [HttpGet]、[HttpPost]、[HttpPut]、[HttpDelete] 分别标记各个方法
[FromBody] 特性标记 该参数来自哪里 [FromBody] 表示来自 HTTP 请求体 [FromUri] 表示参数来自URL 地址
[HttpGet]
public IEnumerable<PersonModel> GetPersons()
[HttpGet]
public PersonModel GetPersonByIdNumber(PersonModel idNumber)
[HttpPost]
public void AddPerson([FromBody]PersonModel person)
[HttpPut]
public void UpdatePersonByIdNumber(int id, [FromBody]PersonModel person)
[HttpDelete]
public void DeletePersonByIdNumber(string idNumber)
完成方法
using DemoWebApi.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
namespace DemoWebApi.Controllers
{
    public class PersonController : ApiController
    {
        static List<PersonModel> personList = new List<PersonModel>()
        {
            new PersonModel() {  Name="鲁迅认识的那只猹", Gender="男", Address="来自星星", IdNumber="123"},
            new PersonModel() {  Name="路人甲", Gender="男", Address="Earth", IdNumber="124"},
            new PersonModel() {  Name="吃瓜群众", Gender="男", Address="Sky", IdNumber="125"},
        };
        /// <summary>
        /// 获取全部的Person
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public IEnumerable<PersonModel> GetPersons()
        {
            return personList;
        }
        /// <summary>
        /// 根据IdNumber查找学生
        /// </summary>
        /// <param name="idNumber"></param>
        /// <returns></returns>
        [HttpGet]
        public PersonModel GetPersonByIdNumber(string idNumber)
        {
            return personList.Find(t => t.IdNumber == idNumber);
        }
        /// <summary>
        /// 添加一个 person
        /// </summary>
        /// <param name="person"></param>
        [HttpPost]
        public void AddPerson([FromBody]PersonModel person)
        {
            personList.Add(person);
        }
        /// <summary>
        /// 更新 指定idNumber 的person对象
        /// </summary>
        /// <param name="idNumber"></param>
        /// <param name="person"></param>
        [HttpPut]
        public void UpdatePersonByIdNumber([FromUri]string idNumber, [FromBody]PersonModel person)
        {
            PersonModel tempPerson = personList.Find(t => t.IdNumber == idNumber);
            if (tempPerson != null)
            {
                tempPerson.Name = person.Name;
                tempPerson.Address = person.Address;
                tempPerson.Gender = person.Gender;
            }
        }
        /// <summary>
        /// 根据idNumber 删除对象
        /// </summary>
        /// <param name="idNumber"></param>
        [HttpDelete]
        public void DeletePersonByIdNumber(string idNumber)
        {
            personList.RemoveAll(t => t.IdNumber == idNumber);
        }
    }
}
在浏览器中使用GET方法
直接运行在浏览器中查看 访问 http://localhost:60544/API/Person 这个地址,哈 我们发现 我们的数据直接就被显示成 xml格式了。
因为浏览器默认的网址就是发送的GET 请求,在浏览器中就可以直接查看,而不用去写额外的代码。
<?xml version="1.0" encoding="utf-8"?>
<ArrayOfPersonModel xmlns="http://schemas.datacontract.org/2004/07/DemoWebApi.Models" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
  <PersonModel>
    <Address>来自星星</Address>
    <Gender>男</Gender>
    <IdNumber>123</IdNumber>
    <Name>鲁迅认识的那只猹</Name>
  </PersonModel>
  <PersonModel>
    <Address>Earth</Address>
    <Gender>男</Gender>
    <IdNumber>124</IdNumber>
    <Name>路人甲</Name>
  </PersonModel>
  <PersonModel>
    <Address>Sky</Address>
    <Gender>男</Gender>
    <IdNumber>125</IdNumber>
    <Name>吃瓜群众</Name>
  </PersonModel>
</ArrayOfPersonModel>
在浏览器使用IdNumber查找Person
运行程序并访问 以下的网址 http://localhost:60544/API/Person?IdNumber=123 , 我们发现我们想要的内容出现了。
<?xml version="1.0" encoding="utf-8"?>
<PersonModel xmlns="http://schemas.datacontract.org/2004/07/DemoWebApi.Models" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
  <Address>来自星星</Address>
  <Gender>男</Gender>
  <IdNumber>123</IdNumber>
  <Name>鲁迅认识的那只猹</Name>
</PersonModel>
通过代码进行GET POST PUT DELETE 操作
我们的代码将会有C#何Java两个不同的版本。用来测试我们的WebApi , 由于比较懒,我就不进行发布到IIS操作了,访问的时候,我将直接运行着我的WebApi进行操作。
GET 请求
这里只查询了全部的Person, 如果想要 根据 IdNumber 查询,可以使用 URL 串参数的方式进行查询
C#版本
static void GetPerson()
{
    HttpWebRequest webRequest = WebRequest.Create("http://localhost:60544/API/Person") as HttpWebRequest;
    webRequest.Method = "GET";
    //设置一些请求的参数
    //这是可接收内容的类型 /webRequest.ContentType = "text/json" 为 json 格式
    // webRequest.ContentType = "text/xml"; 为xml格式
    webRequest.ContentType = "text/json";
    //webRequest.ContentType = "text/xml";
    //直到 执行GeTResponse() 时候才进行发送请求
    HttpWebResponse response = webRequest.GetResponse() as HttpWebResponse;
    //获取结果代码
    HttpStatusCode code = response.StatusCode;
    Console.WriteLine(code.ToString());
    Stream stream = response.GetResponseStream();
    StreamReader reader = new StreamReader(stream, Encoding.UTF8);
    string value = reader.ReadToEnd();
    Console.WriteLine(value);
    stream.Close();
    stream.Flush();
}
输出结果
[
    {
        "IdNumber": "123",
        "Name": "鲁迅认识的那只猹",
        "Gender": "男",
        "Address": "来自星星"
    },
    {
        "IdNumber": "124",
        "Name": "路人甲",
        "Gender": "男",
        "Address": "Earth"
    },
    {
        "IdNumber": "125",
        "Name": "吃瓜群众",
        "Gender": "男",
        "Address": "Sky"
    }
]
Java 版本
public static void getPerson() {
	try {
		URL url = new URL("http://localhost:60544/API/Person");
		HttpURLConnection conn = (HttpURLConnection) url.openConnection();
		// 设置一些请求的属性
		conn.setRequestProperty("ContentType", "text/json");
		// 设置请求方法
		conn.setRequestMethod("GET");
		// 获取结果码
		int code = conn.getResponseCode();
		System.out.println("结果代码:" + code);
		StringBuffer buffer = new StringBuffer();
		// 获取到请求的结果
		InputStreamReader reader = new InputStreamReader(conn.getInputStream(), "utf-8");
		int c = -1;
		while ((c = reader.read()) != -1) {
			buffer.append((char) c);
		}
		System.out.println(buffer.toString());
		reader.close();
	} catch (Exception e) {
	}
}
输出结果
结果代码:200
[
    {
        "IdNumber": "123",
        "Name": "鲁迅认识的那只猹",
        "Gender": "男",
        "Address": "来自星星"
    },
    {
        "IdNumber": "124",
        "Name": "路人甲",
        "Gender": "男",
        "Address": "Earth"
    },
    {
        "IdNumber": "125",
        "Name": "吃瓜群众",
        "Gender": "男",
        "Address": "Sky"
    }
]
POST 请求
GET 请求直接通过URL传递参数即可参数,POST 需要将参数放到请求体中。
C#代码
/// <summary>
/// 添加一个Person
/// </summary>
static void PostPerson()
{
    //我们要传递一个Person对象,格式直接是  属性=值&属性=值....
    string person = "IdNumber=126&Name=Test&Gender=男&Address=Test";
    byte[] buffer = Encoding.UTF8.GetBytes(person);
    HttpWebRequest webRequest = WebRequest.Create("http://localhost:60544/API/Person") as HttpWebRequest;
    //设置传递的参数格式为 名称/值对 的标准格式
    webRequest.ContentType = "application/x-www-form-urlencoded";
    webRequest.Method = "POST";
    webRequest.AllowWriteStreamBuffering = true;
    //写入数据
    Stream requestStream = webRequest.GetRequestStream();
    requestStream.Write(buffer, 0, buffer.Length);
    requestStream.Close();
    requestStream.Flush();
    //直到 执行GeTResponse() 时候才进行发送请求
    HttpWebResponse response = webRequest.GetResponse() as HttpWebResponse;
    //获取结果代码
    HttpStatusCode code = response.StatusCode;
    Console.WriteLine((int)code+" "+code.ToString());
}
输出结果 这是我们再次运行 GetPerson() 方法会有以下结果
[
    {
        "IdNumber": "123",
        "Name": "鲁迅认识的那只猹",
        "Gender": "男",
        "Address": "来自星星"
    },
    {
        "IdNumber": "124",
        "Name": "路人甲",
        "Gender": "男",
        "Address": "Earth"
    },
    {
        "IdNumber": "125",
        "Name": "吃瓜群众",
        "Gender": "男",
        "Address": "Sky"
    },
  	//这是我们新添加的记录
    {
        "IdNumber": "126",
        "Name": "Test",
        "Gender": "男",
        "Address": "Test"
    }
]
Java代码
public static void postPerson() {
	try {
		String person = "IdNumber=126&Name=Test&Gender=男&Address=Test";
		URL url = new URL("http://localhost:60544/API/Person");
		HttpURLConnection conn = (HttpURLConnection) url.openConnection();
		// 设置请求方法
		conn.setRequestMethod("POST");
		//POST 必须有下面的代码
		conn.setDoOutput(true);
		//写入数据
		OutputStreamWriter writer = new OutputStreamWriter(conn.getOutputStream(), "utf-8");
		writer.write(person);
		writer.flush();
		writer.close();
		// 获取结果码
		int code = conn.getResponseCode();
		System.out.println("结果代码:" + code);
	} catch (Exception e) {
		e.printStackTrace();
	}
}
源码下载
剩下的PUT DELETE 请求基本类似这里就不在贴出,如要查看请下载源码
NOTE: Java中的PUT请求不知为何一直无法请求成功 415 错误码
C#调用和WEBAPI https://git.oschina.net/ShareKnowledge/demoWebApi
Java 调用 http://git.oschina.net/ShareKnowledge/JavaDiaoYongWEBAPI
WebApi入门的更多相关文章
- Asp.Net Core WebAPI入门整理(三)跨域处理
		
一.Core WebAPI中的跨域处理 1.在使用WebAPI项目的时候基本上都会用到跨域处理 2.Core WebAPI的项目中自带了跨域Cors的处理,不需要单独添加程序包 3.使用方法简单 ...
 - Asp.Net Core WebAPI入门整理(二)简单示例
		
一.Core WebAPI中的序列化 使用的是Newtonsoft.Json,自定义全局配置处理: // This method gets called by the runtime. Use thi ...
 - Asp.Net Core WebAPI入门整理(四)参数获取
		
一.总结整理,本实例对应.Net Core 2.0版本 1.在.Net Core WebAPI 中对于参数的获取及自动赋值,沿用了Asp.Net MVC的有点,既可以单个指定多个参数,右可以指定Mo ...
 - Taurus.MVC WebAPI  入门开发教程1:框架下载环境配置与运行(含系列目录)。
		
前言: Taurus.MVC 微服务版本已经发布了:Taurus.MVC V3.0.3 微服务开源框架发布:让.NET 架构在大并发的演进过程更简单. 以前都是框架发布时写点相关功能点的文章,没有形成 ...
 - Taurus.MVC WebAPI 入门开发教程2:添加控制器输出Hello World。
		
系列目录 1.Taurus.MVC WebAPI 入门开发教程1:框架下载环境配置与运行. 2.Taurus.MVC WebAPI 入门开发教程2:添加控制器输出Hello World. 3.Tau ...
 - Taurus.MVC WebAPI 入门开发教程3:路由类型和路由映射。
		
系列目录 1.Taurus.MVC WebAPI 入门开发教程1:框架下载环境配置与运行. 2.Taurus.MVC WebAPI 入门开发教程2:添加控制器输出Hello World. 3.Tau ...
 - Taurus.MVC WebAPI 入门开发教程4:控制器方法及参数定义、获取及基础校验属性【Require】。
		
系列目录 1.Taurus.MVC WebAPI 入门开发教程1:框架下载环境配置与运行. 2.Taurus.MVC WebAPI 入门开发教程2:添加控制器输出Hello World. 3.Tau ...
 - Taurus.MVC WebAPI 入门开发教程5:控制器安全校验属性【HttpGet、HttpPost】【Ack】【Token】【MicroService】。
		
系列目录 1.Taurus.MVC WebAPI 入门开发教程1:框架下载环境配置与运行. 2.Taurus.MVC WebAPI 入门开发教程2:添加控制器输出Hello World. 3.Tau ...
 - Taurus.MVC WebAPI 入门开发教程6:全局控制器DefaultController与全局事件。
		
系列目录 1.Taurus.MVC WebAPI 入门开发教程1:框架下载环境配置与运行. 2.Taurus.MVC WebAPI 入门开发教程2:添加控制器输出Hello World. 3.Tau ...
 - Taurus.MVC WebAPI 入门开发教程8:WebAPI文档与自动化测试。
		
系列目录 1.Taurus.MVC WebAPI 入门开发教程1:框架下载环境配置与运行. 2.Taurus.MVC WebAPI 入门开发教程2:添加控制器输出Hello World. 3.Tau ...
 
随机推荐
- 20155236 2016-2017-2 《Java程序设计》第五周学习总结
			
20155236 2016-2017-2 <Java程序设计>第五周学习总结 教材学习内容总结 Java的异常处理是通过5个关键字来实现的:try,catch,throw,throws,f ...
 - 20155217 2016-2017-2 《Java程序设计》第4周学习总结
			
20155217 2016-2017-2 <Java程序设计>第4周学习总结 教材学习内容总结 第六章 在java中,继承时使用extends关键字,private成员也会被继承,只不过子 ...
 - Throwable、Error、Exception、RuntimeException 区别
			
1.java将所有的错误封装为一个对象,其根本父类为Throwable, Throwable有两个子类:Error和Exception. 2.Error是Throwable 的子类,用于指示合理的应用 ...
 - SpringBoot与异步任务、定时任务、邮件任务
			
异步任务 在需要开启异步的服务加上注解:@Async @Service public class AsyncService { //告诉SpringBoot这是一个异步任务,SpringBoot会自动 ...
 - Strusts2笔记4--类型转换器
			
类型转换器: Struts2默认情况下可以将表单中输入的文本数据转换为相应的基本数据类型.这个功能的实现,主要是由于Struts2内置了类型转换器.这些转换器在struts-default.xml中可 ...
 - ubuntu git 简单入门【转】
			
转自:http://blog.chinaunix.net/uid-20718384-id-3334859.html 1. 安装 sudo apt-get install git-core 2. 初始 ...
 - Oracle 11G R2 RAC中的scan ip 的用途和基本原理【转】
			
Oracle 11G R2 RAC增加了scan ip功能,在11.2之前,client链接数据库的时候要用vip,假如你的cluster有4个节点,那么客户端的tnsnames.ora中就对应有四个 ...
 - MinGw 和 cygwin 的区别和联系
			
原创 by zoe.zhang .......................................................... 1. windows与Linux操作系统的不同 ...
 - Github授权新的设备ssh接入
			
为Mac生成公钥 步骤: 检查本机是否已有公钥 ls -la ~/.ssh 将原来的公钥删除 rm -rf ~/.ssh 生成新的公钥(填自己的邮箱),然后除了密码,一路默认 ssh-keygen - ...
 - mysql命令补全工具
			
需要在linux中下载mysql插件. 安装mysql插件 yum -y install epel-release python-pip python-devel pip install mycli ...