Wcf体现Restful风格

Wcf体现Restful风格

概述

含状态传输(Representational State Transfer)的软件架构风格。主要特点

1、  资源是由URI来指定: 例如http://example.com/resources/

2、  对资源的操作 包括获取、创建、修改和删除资源,这些操作正好对应HTTP协议提供的GET、POST、PUT和DELETE方法

3、  传输的资源:Web服务接受与返回的互联网媒体类型,比如:JSONXML ,YAML 等。

下面通过一个简单的例子逐个问题解决。

问题简述

图书管理,功能可以查看全部数目,也可以查看一本书的详情,同样也可以通过浏览器对书目资源进行添加、修改、删除。

代码简介

接口定义

接口契约定义,将数目看做一种资源,通过设置UriTemplate属性,我们可以通过uri访问书目资源。(主要WebGet对应于http中的get请求方法,WebInvoke对应于PUT、POST、DELETE)这里有对应的我个操作,查看所有数目,查看具体那本书,对书进行添加、更新、删除。

<span style="font-size:18px;"> [ServiceContract]

    public interface IBookService

    {

        [OperationContract]

        [WebGet(UriTemplate="all",ResponseFormat=WebMessageFormat.Json)]

        List<Book>GetBooksList();

        [OperationContract]

        [WebGet(UriTemplate = "Book/{id}")]//WebGet对应于get请求

        BookGetBookById(string id);

        [OperationContract]

        [WebInvoke(UriTemplate = "AddBook",Method = "PUT")]

        void AddBook(Bookbook);

        [OperationContract]

        [WebInvoke(UriTemplate="UpdateBook",Method="POST")]

        void UpdateBook(Bookbook);

        [OperationContract]

        [WebInvoke(UriTemplate="DeleteBook/{id}",Method="DELETE")]

        void DeleteBook(stringid);

    }

    [DataContract]

    public class Book

    {

        [DataMember]

        public int ID { get; set; }

        [DataMember]

        public stringBookName { get; set;}

        [DataMember]

        public stringBookPrice { get; set;}

    }</span>

实现接口

这里为了简单将书目存在一个静态的泛型集合中。

<span style="font-size:18px;"> public class BookService : IBookService

    {

        public static List<Book>_listBooks = null;

        public List<Book> GetBooksList()

        {

            if (_listBooks == null)

            {

               _listBooks = new List<Book>(){

            new Book{ID=1,BookName="The west story",BookPrice="$29.0"},

            new Book{ID=2,BookName="Jack",BookPrice="$40.8"}};

            }

            return _listBooks;

        }

        public BookGetBookById(string id)

        {

            try

            {

               int bookId = Convert.ToInt32(id);

               Book book =_listBooks.FirstOrDefault(e => e.ID == bookId);

               if (null== book)

               {

                   WebOperationContext.Current.OutgoingResponse.StatusCode= HttpStatusCode.NotFound;

               }

               return book;

            }

            catch

            {

               throw newFaultException("Somethingwent wrong");

            }

        }

        ///<summary>

        ///添加

        ///</summary>

        ///<param name="book"></param>

        public void AddBook(Book book)

        {

           _listBooks.Add(book);

        }

        ///<summary>

        ///删除

        ///</summary>

        ///<param name="id"></param>

        public voidDeleteBook(string id)

        {

            Book book = GetBookById(id);

           _listBooks.Remove(book);

        }

        public voidUpdateBook(Book book)

        {

            this.DeleteBook(book.ID.ToString());

            this.AddBook(book);

        }

    }

}</span>

配置文件

<span style="font-size:18px;"><system.serviceModel>

   <behaviors>

     <endpointBehaviors>

       <behaviorname="restfulBehavior">

         <webHttphelpEnabled="true" />

       </behavior>

     </endpointBehaviors>

     <serviceBehaviors>

       <behaviorname="">

         <serviceMetadatahttpGetEnabled="true"  />

         <serviceDebugincludeExceptionDetailInFaults="false" />

       </behavior>

     </serviceBehaviors>

   </behaviors>

   <services>

     <servicename="WcfRestSample.BookService">

       <endpointaddress=""behaviorConfiguration="restfulBehavior"

         binding="webHttpBinding"bindingConfiguration=""contract="WcfRestSample.IBookService" />

     </service>

   </services>

   <serviceHostingEnvironmentmultipleSiteBindingsEnabled="true" />

 </system.serviceModel></span>

测试

访问所有数目http://localhost:53215/IBookService.svc/all

访问具体书目http://localhost:53215/IBookService.svc/Book/1

对书目管理这里笔者用fiddler的composer对服务器PUT POST GET请求

添加书

PUThttp://localhost:53215/IBookService.svc/UpdateBook  HTTP/1.1

Content-Type: application/xml;charset=utf-8

Host:localhost:53215

Conent-Length:187

Expect:100-continue

Accept-Encoding:gzip,deflate

<Bookxmlns="http://schemas.datacontract.org/2004/07/WcfRestSample"xmlns:i="http://www.w3.org/2001/XMLSchema-instance"><BookName>SharePoint2010</BookName><BookPrice>$29.0</BookPrice><ID>3</ID></Book>

更新(这里是先删除在更新)

POSThttp://localhost:53215/IBookService.svc/UpdateBook  HTTP/1.1

Content-Type: application/xml;charset=utf-8

Host:localhost:53215

Conent-Length:187

Expect:100-continue

Accept-Encoding:gzip,deflate

<Bookxmlns="http://schemas.datacontract.org/2004/07/WcfRestSample"xmlns:i="http://www.w3.org/2001/XMLSchema-instance"><BookName>SharePoint2010开发最佳实践</BookName><BookPrice>$29.0</BookPrice><ID>3</ID></Book>

总结

这里只是对restful风格在wcf中简单介绍,有不足的地方还希望大家提出,多多交流,热爱编程。

时间: 2024-10-19 03:27:07

Wcf体现Restful风格的相关文章

Restful风格wcf调用4——权限认证

写在前面 在前面的三篇文章,已经介绍了restful风格wcf,如何实现增删改查以及文件的上传下载操作.本篇文章将介绍一下,调用restful的权限认证的内容.在调用的接口,为了安全,总会需要对请求进行权限认证的.以防一些非法的操作. 系列文章 Restful风格wcf调用 Restful风格wcf调用2——增删改查 Restful风格wcf调用3——Stream 一个例子 在REST WCF中,我们可以利用 HttpHeader 来完成这一目标. 首先我们添加一个校验身份的一个方法. ///

Restful风格wcf调用3——Stream

写在前面 上篇文章介绍了restful接口的增删改查,本篇文章将介绍,如何通过数据流进行文件的上传及下载操作. 系列文章 Restful风格wcf调用 Restful风格wcf调用2——增删改查 一个例子 添加一个wcf服务,并在global.asax中注册路由,并修改svc文件的标记,添加Factory属性. //注册路由 System.Web.Routing.RouteTable.Routes.Add(new System.ServiceModel.Activation.ServiceRou

Restful风格wcf调用

写在前面 公司有个项目,需要和sharepoint集成,用到了restful,在网上查了一下,wcf方式来实现,还是很方便的,就采用了这种方式,至于web api,没研究过,由于接口急着用,就采用wcf了,用起来也比较顺手. 概念 什么是rest? REST 描述了一个架构样式的互联系统(如 Web 应用程序).REST 约束条件作为一个整体应用时,将生成一个简单.可扩展.有效.安全.可靠的架构.由于它简便.轻量级以及通过 HTTP 直接传输数据的特性,RESTful Web 服务成为基于 SO

Restful风格wcf调用2——增删改查

写在前面 上篇文章介绍如何将wcf项目,修改成restful风格的接口,并在上面提供了查询的功能,上篇文章中也感谢园友在评论中的提的建议,自己也思考了下,确实是那个道理.在urltemplate中,定义的url确实不规范,虽然能实现功能,但是缺少点专业性.rest风格的请求,是通过post,delete,get,put等请求方法来区别的,而不是通过在url中取不同的名字来进行区别.这里再次感谢@~Js园友提醒. 在这篇文章中将最新的代码贴出来,方便查看. 系列文章 Restful风格wcf调用 

使用Restful风格的Web Service(Maven版本)

[该教程翻译自Spring官方,并进行适当删减.] 你将搭建的 你将创建的应用将使用Spring的RestTemplate来获取Facebook的Graph API的数据.(符合Restful风格) http://graph.facebook.com/pivotalsoftware 它将返回的JSON字符串为: { "id": "161112704050757", "about": "Pivotal is enabling the cr

通过beego快速创建一个Restful风格API项目及API文档自动化(转)

通过beego快速创建一个Restful风格API项目及API文档自动化 本文演示如何快速(一分钟内,不写一行代码)的根据数据库及表创建一个Restful风格的API项目,及提供便于在线测试API的界面. 一.创建数据库及数据表(MySQL) #db--jeedev -- ---------------------------- -- Table structure for `app` -- ---------------------------- DROP TABLE IF EXISTS `a

RESTful风格的Web服务框架:Swagger

Swagger与SpringMVC项目整合 为了方便的管理项目中API接口,在网上找了好多关于API接口管理的资料,感觉目前最流行的莫过于Swagger了,功能强大,UI界面漂亮,并且支持在线测试等等,所以本人仔细研究了下Swagger的使用,下面就如何将Swagger与个人的SpringMVC项目进行整合做详细说明: 最终API管理界面:  详细步骤: Step1:项目中引入相关jar包: <properties> <project.build.sourceEncoding>UT

PHP实现RESTful风格的API实例(一)

(关于Yii2的RESTful教程请看: Yii2框架RESTful API教程) 最近看了一些关于RESTful的资料,自己动手也写了一个RESTful实例,以下是源码 目录详情: restful/ Request.php 数据操作类 Response.php 输出类 index.php 入口文件 .htaccess 重写url Request.php :包含一个Request类,即数据操作类.接收到URL的数据后,根据请求URL的方式(GET|POST|PUT|PATCH|DELETE)对数

Restful风格API接口开发springMVC篇

Restful风格的API是一种软件架构风格,设计风格而不是标准,只是提供了一组设计原则和约束条件.它主要用于客户端和服务器交互类的软件.基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制. 在Restful风格中,用户请求的url使用同一个url而用请求方式:get,post,delete,put...等方式对请求的处理方法进行区分,这样可以在前后台分离式的开发中使得前端开发人员不会对请求的资源地址产生混淆和大量的检查方法名的麻烦,形成一个统一的接口. 在Restful风格中,现