很早之前看到過RESTful Web Services,並未在意,也沒找相關資料進行學習。今天偶爾有一機會,就找了點資料進行研究,發現RESTful真是“簡約而不簡單”。下面用示例來說明:
1 項目結構
2 REST 服務接口定義
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.ServiceModel; 6 using System.ServiceModel.Web; 7 namespace Jack_Restful_Service 8 { 9 10 [ServiceContract(Name = "RestfulService",Namespace="http://www.cnblogs.com/isaboy")] 11 public interface IRestDemoServices 12 { 13 [OperationContract] 14 [WebGet(UriTemplate = Routing.GetClientRoute, BodyStyle = WebMessageBodyStyle.Bare)] 15 string GetClientNameById(string Id); 16 17 [OperationContract] 18 [WebGet(UriTemplate = Routing.AddClientRoute, BodyStyle = WebMessageBodyStyle.Bare)] 19 string Add(string a, string b); 20 //error 21 //string Add(int a, int b); 22 23 [OperationContract] 24 [WebGet(UriTemplate = Routing.LoginClientRoute, BodyStyle = WebMessageBodyStyle.Bare)] 25 string Login(string uname, string upwd); 26 27 //post 28 [OperationContract] 29 [WebInvoke(RequestFormat = WebMessageFormat.Json, 30 ResponseFormat = WebMessageFormat.Json, 31 BodyStyle = WebMessageBodyStyle.Bare, 32 Method = "POST", UriTemplate = "/Client/UpdateUser/{uname}")] 33 User UpdateUser(string uname, User newUser); 34 35 } 36 //URI路由 37 public static class Routing 38 { 39 public const string GetClientRoute = "/Client/{id}"; 40 41 public const string AddClientRoute = "/Client/{a},{b}"; 42 //{uname}裡面的參數名稱要和string Login(string uname, string upwd);一致 43 public const string LoginClientRoute = "/Client/{uname}__{upwd}"; 44 } 45 46 47 }
3 REST服務接口實現
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.ServiceModel; 6 using System.ServiceModel.Activation; 7 namespace Jack_Restful_Service 8 { 9 10 [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, 11 ConcurrencyMode = ConcurrencyMode.Single, 12 IncludeExceptionDetailInFaults = true, 13 Namespace = "http://www.cnblogs.com/isaboy")] 14 [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 15 public class RestDemoServices : IRestDemoServices 16 { 17 //GET 18 public string GetClientNameById(string Id) 19 { 20 string ReturnString = "Your id is: " + Id; 21 22 return ReturnString; 23 } 24 25 public string Add(string a, string b) 26 { 27 int sum = int.Parse(a) + int.Parse(b); 28 return sum.ToString(); 29 } 30 31 public string Login(string uname, string upwd) 32 { 33 if (uname == "admin" && upwd == "admin") 34 { 35 return "success"; 36 } 37 else 38 { 39 return "false"; 40 } 41 } 42 //POST 43 public User UpdateUser(string uname, User newUser) 44 { 45 return newUser; 46 } 47 } 48 49 }
4 將服務HOST
1 Console.WriteLine("----------Restful Service Start--------------"); 2 RestDemoServices demoServices = new RestDemoServices(); 3 WebServiceHost _serviceHost = new WebServiceHost(demoServices, new Uri("http://localhost:8000/RestfulService")); 4 _serviceHost.Open(); 5 Console.WriteLine("----------Restful Service Opened--------------"); 6 Console.WriteLine("http://localhost:8000/RestfulService/Client/8"); 7 Console.WriteLine("http://localhost:8000/RestfulService/Client/2,5"); 8 Console.WriteLine("http://localhost:8000/RestfulService/Client/admin__admin");
5 打開浏覽器,即可進行資源訪問
另外,我們可以用代碼進行測試
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Web; 6 using System.Net; 7 using System.IO; 8 namespace PostServiceTest 9 { 10 class Program 11 { 12 static void Main(string[] args) 13 { 14 //get 15 HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://localhost:8000/RestfulService/Client/8"); 16 WebResponse response = request.GetResponse(); 17 string result = new StreamReader(response.GetResponseStream()).ReadToEnd(); 18 Console.WriteLine(result); 19 20 //post 21 string requestData = "{\"uname\":\"admin\",\"upwd\":\"admin\"}"; 22 byte[] data = Encoding.UTF8.GetBytes(requestData); 23 request = (HttpWebRequest)WebRequest.Create("http://localhost:8000/RestfulService/Client/UpdateUser/admin"); 24 request.Method = "POST"; 25 request.ContentType = "application/json"; 26 Stream dataStream = request.GetRequestStream(); 27 dataStream.Write(data, 0, data.Length); 28 dataStream.Close(); 29 30 response = request.GetResponse(); 31 result = new StreamReader(response.GetResponseStream()).ReadToEnd(); 32 Console.WriteLine(result); 33 Console.ReadKey(); 34 } 35 } 36 }