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;