概述

Representational State Transfer(REST)是Roy Fielding博士在2000年他的博士论文中提出来的一种软件架构风格。

因此REST是设计风格而不是标准,REST通常基于使用HTTP,URI,和JSON,XML以及HTML这些现有的广泛流行的协议和标准。
  • 资源是由URI来指定,rest中的资源需要使用名词来命名。
  • 对资源的操作包括获取、创建、修改和删除资源,这些操作正好对应HTTP协议提供的GET、POST、PUT和DELETE方法。
  • 通过操作资源的表形来操作资源。
  • 资源的表现形式则是XML,JSON或者两者都有。
REST的要求
  • 显示的使用HTTP方法访问资源
  • 连接协议具有无状态性
  • 能够利用Cache机制增进性能
  • 公开目录结构式的URL
  • 在需要时可以传输Javascript (可选)
REST的优点
  • 可以利用缓存Cache来提高响应速度
  • 通讯本身的无状态性可以让不同的服务器的处理一系列请求中的不同请求,提高服务器的扩展性
  • 浏览器即可作为客户端,简化软件需求
  • 相对于其他叠加在HTTP协议之上的机制,REST的软件依赖性更小
  • 不需要额外的资源发现机制
  • 在软件技术演进中的长期的兼容性更好

在WCF中构建REST

一、按一下结构创建项目,其中WCF.REST.Services项目选用WCF REST Service Template 40(CS)模板

Contracts引用System.ServiceModel和System.ServiceModel.Web

Services引用Contracts

二、在Contracts项目中创建接口个传输类:传输类会在调用的客户端等地方使用,建议使用全小写,以免调用时产生疏忽。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
using System;
  
namespace WCF.REST.Contracts
{
    /// <summary>
    /// 该类用于传输
    /// </summary>
    public class item
    {
        public int id { get; set; }
        public string name { get; set; }
        public decimal money { get; set; }
        public DateTime birthday { get; set; }
        public int number { get; set; }
    }
}

三、在Contracts项目中创建协议接口:在这里定义接口,方便维护,将接口和实现类进行分离。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
using System.Collections.Generic;
using System.ServiceModel;
using System.ServiceModel.Web;
  
namespace WCF.REST.Contracts
{
    /// <summary>
    /// 服务协议
    /// </summary>
    [DataContractFormat]
    [ServiceContract]
    public interface IItem
    {
        [WebGet(UriTemplate = "")]
        List<item> GetCollection();
  
        [WebInvoke(UriTemplate = "", Method = "POST")]
        item Create(item instance);
  
        [WebGet(UriTemplate = "{id}")]
        item Get(string id);
  
        [WebInvoke(UriTemplate = "{id}", Method = "PUT", BodyStyle = WebMessageBodyStyle.WrappedRequest)]
        item Update(string id, item instance);
  
        [WebInvoke(UriTemplate = "{id}", Method = "DELETE")]
        void Delete(string id);
    }
}

四、在Services中创建逻辑类,用于存储列表:真实项目时这个类可以单独放在业务逻辑层中。

1
2
3
4
5
6
7
8
9
10
11
12
13
using System.Collections.Generic;
using WCF.REST.Contracts;
  
namespace WCF.REST.Services
{
    /// <summary>
    /// 服务逻辑
    /// </summary>
    public static class ItemsBL
    {
        public static List<item> list = new List<item>();
    }
}

五、在Services中创建服务类:这是服务的具体实现。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel.Activation;
using WCF.REST.Contracts;
  
namespace WCF.REST.Services
{
    /// <summary>
    /// 服务实现
    /// </summary>
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    public class Items : IItem
    {
        public List<item> GetCollection()
        {
            return ItemsBL.list;
        }
  
        public item Create(item instance)
        {
            lock (ItemsBL.list)
            {
                if (ItemsBL.list.Count > 0)
                    instance.id = ItemsBL.list.Max(p => p.id) + 1;
                else
                    instance.id = 1;
            }
            ItemsBL.list.Add(instance);
            return instance;
        }
  
        public item Get(string id)
        {
            return ItemsBL.list.FirstOrDefault(p => p.id == int.Parse(id));
        }
  
        public item Update(string id, item instance)
        {
            int iid = int.Parse(id);
            item Result = null;
            lock (ItemsBL.list)
            {
                if (ItemsBL.list.Count(p => p.id == iid) > 0)
                {
                    ItemsBL.list.Remove(ItemsBL.list.FirstOrDefault(p => p.id == iid));
                    ItemsBL.list.Add(instance);
                    Result = instance;
                }
            }
            return Result;
        }
  
        public void Delete(string id)
        {
            int iid = int.Parse(id);
            lock (ItemsBL.list)
            {
                if (ItemsBL.list.Count(p => p.id == iid) > 0)
                {
                    ItemsBL.list.Remove(ItemsBL.list.FirstOrDefault(p => p.id == iid));
                }
            }
        }
    }
}

六、修改Global文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
using System;
using System.ServiceModel.Activation;
using System.Web;
using System.Web.Routing;
  
namespace WCF.REST.Services
{
    public class Global : HttpApplication
    {
        void Application_Start(object sender, EventArgs e)
        {
            RegisterRoutes();
        }
  
        private void RegisterRoutes()
        {
            RouteTable.Routes.Add(new ServiceRoute("Items", new WebServiceHostFactory(), typeof(Items)));
        }
    }
}

七、运行服务在地址栏后添加 /items/help 后看到如下界面

ok至此服务部分完成。

WCF REST 基础教程的更多相关文章

  1. WCF基础教程之异常处理:你的Try..Catch语句真的能捕获到异常吗?

    在上一篇WCF基础教程之开篇:创建.测试和调用WCF博客中,我们简单的介绍了如何创建一个WCF服务并调用这个服务.其实,上一篇博客主要是为了今天这篇博客做铺垫,考虑到网上大多数WCF教程都是从基础讲起 ...

  2. matlab基础教程——根据Andrew Ng的machine learning整理

    matlab基础教程--根据Andrew Ng的machine learning整理 基本运算 算数运算 逻辑运算 格式化输出 小数位全局修改 向量和矩阵运算 矩阵操作 申明一个矩阵或向量 快速建立一 ...

  3. <<Bootstrap基础教程>> 新书出手,有心栽花花不开,无心插柳柳成荫

    并非闲的蛋疼,做技术也经常喜欢蛋疼,纠结于各种技术,各种需求变更,还有一个很苦恼的就是UI总是那么不尽人意.前不久自己开源了自己做了多年的仓储项目(开源地址:https://github.com/he ...

  4. Memcache教程 Memcache零基础教程

    Memcache是什么 Memcache是danga.com的一个项目,来分担数据库的压力. 它可以应对任意多个连接,使用非阻塞的网络IO.由于它的工作机制是在内存中开辟一块空间,然后建立一个Hash ...

  5. Selenium IDE 基础教程

    Selenium IDE 基础教程 1.下载安装     a 在火狐浏览其中搜索附件组件,查找 Selenium IDE     b 下载安装,然后重启firefox 2.界面讲解      在菜单- ...

  6. html快速入门(基础教程+资源推荐)

    1.html究竟是什么? 从字面上理解,html是超文本标记语言hyper text mark-up language的首字母缩写,指的是一种通用web页面描述语言,是用来描述我们打开浏览器就能看到的 ...

  7. 转发-UI基础教程 – 原生App切图的那些事儿

    UI基础教程 – 原生App切图的那些事儿 转发:http://www.shejidaren.com/app-ui-cut-and-slice.html 移动APP切图是UI设计必须学会的一项技能,切 ...

  8. 【Unity3D基础教程】给初学者看的Unity教程(四):通过制作Flappy Bird了解Native 2D中的RigidBody2D和Collider2D

    作者:王选易,出处:http://www.cnblogs.com/neverdie/ 欢迎转载,也请保留这段声明.如果你喜欢这篇文章,请点[推荐].谢谢! 引子 在第一篇文章[Unity3D基础教程] ...

  9. oracle基础教程(8)oracle修改字符集

    oracle基础教程(8)oracle修改字符集 1.用dba连接数据库 -->sqlplus / as sysdba 2.查看字符集 -->SELECT parameter, value ...

随机推荐

  1. XML与JSON的区别?各自有哪些优缺点?

    JSON和XML都是数据传输格式,它们有哪些区别,又都有些什么优缺点呢?零度带领大家来分析分析. 一.先来看看两者的定义 1.XML的定义 扩展标记语言 (Extensible Markup Lang ...

  2. Ajax缓存原理

    一.什么是Ajax缓存原理? Ajax在发送的数据成功后,会把请求的URL和返回的响应结果保存在缓存内,当下一次调用Ajax发送相同的请求时,它会直接从缓存中把数据取出来,这是为了提高页面的响应速度和 ...

  3. nginx最新配置

    #user  nobody;worker_processes  1; #error_log  logs/error.log;#error_log  logs/error.log  notice;#er ...

  4. area热点区域

    <area>标记:主要用于图像地图,通过该标记可以在图像地图中设定作用区域(又称为热点),这样当用户的鼠标移到指定的作用区域点击时,会自动链接到预先设定好的页面.其基本语法结构如下: &l ...

  5. Android-Volley网络通信框架(二次封装数据请求和图片请求(包含处理请求队列和图片缓存))

    1.回想 上篇 使用 Volley 的 JsonObjectRequest 和 ImageLoader 写了 电影列表的样例 2.重点 (1)封装Volley 内部 请求 类(请求队列,数据请求,图片 ...

  6. jQuery Easy UI Panel(面板)组件

    panel(面板)组件,跟前面的组件使用方法差点儿都差点儿相同,也是从设置一些面板属性.操作面板触发的事件.我们可针对面板对象的操作方法这三个点去学习. 后面有一些组件要依赖于这个组件. 另一点跟前面 ...

  7. TextView-显示自己添加的字体样式

    1.首先要把我们的字体放到相应的目录下 如果我们仅仅是想要验证一个字体,我们可以直接 我们的字体push到 手机 /system/fonts/ 目录下面 2.在代码中进行设置 import andro ...

  8. Android广告轮播图实现

    先看效果 第一步,布局 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmln ...

  9. socket 笔记(一)

    #include "stdafx.h" #include "WINSOCK2.H" #pragma comment(lib,"WS2_32.lib&q ...

  10. 在手机中预置联系人/Service Number

    代码分为两部分: Part One 将预置的联系人插入到数据库中: Part Two 保证预置联系人仅仅读,无法被编辑删除(在三个地方屏蔽对预置联系人进行编辑处理:联系人详情界面.联系人多选界面.新建 ...