理解 RESTful WebService

RESTful 服務遵循REST(Representational State Transfer)的架構風格,中文翻譯爲:表現層狀態轉化瀏覽器

對於全部的CRUD(Read/Create/Update/Delete),RESTFul架構基於HTTP的簡單動做(GET,POST,PUT,And DELETE)來實現。它簡單並且輕巧,比基於SOAP消息的WebService簡單的多的一種輕量級Web服務,RESTful WebService是沒有狀態的,發佈和調用都很是的輕鬆容易。服務器

表現層(Representation)架構

"資源"是一種信息實體,它能夠有多種外在表現形式。咱們把"資源"具體呈現出來的形式,叫作它的"表現層"(Representation)。ui

好比,文本能夠用txt格式表現,也能夠用HTML格式、XML格式、JSON格式表現,甚至能夠採用二進制格式;spa

URI只表明資源的實體,不表明它的形式。URI應該只表明"資源"的位置。它的具體表現形式,應該在HTTP請求的頭信息中用Accept和Content-Type字段指定,這兩個字段纔是對"表現層"的描述。翻譯

狀態轉化(State Transfer):設計

互聯網通訊協議HTTP協議,是一個無狀態協議。這意味着,全部的狀態都保存在服務器端。所以,若是客戶端想要操做服務器,必須經過某種手段,讓服務器端發生"狀態轉化"(State Transfer)。而這種轉化是創建在表現層之上的,因此就是"表現層狀態轉化"。rest

客戶端用到的手段,只能是HTTP協議。具體來講,就是HTTP協議裏面,四個表示操做方式的動詞:GET、POST、PUT、DELETE。它們分別對應四種基本操做:GET用來獲取資源,POST用來新建資源(也能夠用於更新資源),PUT用來更新資源,DELETE用來刪除資源。ci

 

RESTful架構有一些典型的設計誤區:資源

一、URI包含動詞:由於"資源"表示一種實體,應該是名詞,URI不該該有動詞,動詞應該放在HTTP協議中;

二、URI中加入版本號:由於不一樣的版本,能夠理解成同一種資源的不一樣表現形式,應該採用同一個URI。版本號能夠在HTTP請求頭信息的Accept字段中進行區分;

 

例子:

1):建立Class Library Project,項目名爲RestService

引用System.ServiceModel; System.ServiceModel.Web;

IRestServiceDemo代碼以下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using System.ServiceModel.Web;

namespace RestService
{
    [ServiceContract(Name = "RestSercice")]
    public interface IRestServiceDemo
    {
        [OperationContract]
        [WebGet(UriTemplate = Routing.GetClientRouting, BodyStyle = WebMessageBodyStyle.Bare)]
        string GetNameById(string id);

        [OperationContract]
        [WebGet(UriTemplate = Routing.GetClientRouting2, BodyStyle = WebMessageBodyStyle.Bare)]
        string GetAgeById(string id);
    }
    public static class Routing
    {
        public const string GetClientRouting = "/Client/{id}";
        public const string GetClientRouting2 = "/Client/zhj/{id}";
    }
}

RestService實現代碼以下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using System.ServiceModel.Activation;

namespace RestService
{
    [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single,ConcurrencyMode = ConcurrencyMode.Single,IncludeExceptionDetailInFaults = true)]
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    public class RestServiceDemo:IRestServiceDemo
    {
        public string GetNameById(string id)
        {
            string returnStr = id + "name is John" ;
            return returnStr;
        }
        public string GetAgeById(string id)
        {
            string returnStr = id + "age is 18 years old";
            return returnStr;
        }
    }
}

2):建立Console Application項目,項目名爲HostService

引用System.ServiceModel; System.ServiceModel.Web;

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using RestService;
using System.ServiceModel.Web;

namespace HostService
{
    class Program
    {
        static void Main(string[] args)
        {
            RestServiceDemo restServiceDemo = new RestServiceDemo();
            WebServiceHost serviceHost = new WebServiceHost(restServiceDemo,new Uri("http://localhost:8000/MyService"));
            serviceHost.Open();
            Console.ReadKey();
            serviceHost.Close();
        }
    }
}

 

3):運行Host程序,在瀏覽器中輸入對應Service的Url

http://localhost:8000/MyService/Client/3   輸出:3 name is John;

http://localhost:8000/MyService/Client/zhj/3   輸出:3 age is 18 years old;

相關文章
相關標籤/搜索