我的老板问我,落实我们的一些产品的RESTful Web服务。 我们是一个启动,我分配到这个任务只有一个。
我不知道网络服务什么,不说也罢RESTful Web服务。
所以我想上手。
因为我不能告诉我们提供什么样的服务,我能承担这个以下产品:
用户只需输入x和y的参数中的URL,我的服务返回X * Y的结果。 我想这是一个非常基本的RESTful Web服务,对不对? 请忽略像许多用户将如何访问它的细节。 我可以承担很多用户都会有我们的服务。
我该如何开始和我需要什么学?
我应该成立一个Tomcat +前在服务器端REST风格的托管软件?
请给我一些指导和提示。
谢谢
我认为,谷歌阅读器API / Facebook的API / Twitter的API是REST式服务,我要实现的一种很好的例子。 谷歌和其他公司是如何做到这一点?
你没有指定语言,这使得它很难,但也有很多框架,可以帮助你做出一个RESTful服务。
对于Java一个很好的一个是泽西(http://jersey.java.net/),既然你提到的Tomcat我假设你会使用Java。
按照教程,你将建立简单的服务,然后你就可以开始添加更多的复杂性。
您可能需要阅读本:
http://ajaxpatterns.org/RESTful_Service
得到的想法REST
。
例如,当使用GET,POST或PUT,例如,当有各种错误,你应该使用什么响应代码。
好消息是:无论你做什么,你声称它是将REST风格的长。 坏消息:你是那种对自己的定义服务,因为有这样一个RESTful服务没有“标准”的方式。 由于第1项。
如果您的Web服务真的是multiplcation操作一样简单,这将是一个URL yourcompany.com/service/multiply网页的生活可以采取2个参数,也许是老式的GET方法(GET yourcompany.com/service /倍增X = 7&Y = 6)或作为两种POST参数,然后产生由仅仅一个串的“42”的响应。 现在,当您的要求变得更加复杂,你要么让他们被格式化为简单的XML:
<multiply>
<arg value="6">
<arg value="7">
</multiply>
和响应
<response value="42"/>
或任何你觉得喜欢。 或许JSON。 您还需要确保指定哪些HTTP方法应该用于每个方法调用,并确保它们意义(例如,用于上传PUT,DELETE删除对)。 你的想法。 REST风格的不规范,这是考虑Web服务的方式。
我会了解什么是RESTful服务,因为平台无助的时候你不明白的要求是什么开始。
你可以阅读这篇开始: http://www.ibm.com/developerworks/webservices/library/ws-restful/然后只是谷歌基于REST的服务与您决定实施服务的编程语言
简单的例子与WCF REST。
[ServiceContract]
public interface IService1
{
[WebGet(UriTemplate = "contact/{PID}", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
[OperationContract]
Person GetContact(string PID);
//[WebInvoke(Method = "POST", UriTemplate = "person")]
[OperationContract]
[WebInvoke(UriTemplate = "/create", Method = "POST")]
void SaveContact(Person person);
[WebGet(UriTemplate = "/")]//RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)
[OperationContract]
List<Person> GetAllContacts();
[OperationContract]
[WebInvoke(UriTemplate = "/{id}", Method = "PUT")]
void UpdateProduct(string id, Person person);
[OperationContract]
[WebInvoke(UriTemplate = "/{id}", Method = "DELETE")]
void DeleteProduct(string id);
[OperationContract]
[WebInvoke(UriTemplate = "UploadFile")]
void UploadFile(Stream stream);
}
// Use a data contract as illustrated in the sample below to add composite types to service operations.
[DataContract(Namespace = "")]
public class Person
{
[DataMember]
public string PersonId { get; set; }
[DataMember]
public string PersonName { get; set; }
}
Service Implementation :
public class Service1 : IService1
{
public Person GetContact(string PID)
{
return new Person(){PersonId=PID, PersonName=PID+".Name"};
}
public void SaveContact(Person person)
{
int a = 0;
}
public void UpdateProduct(string id, Person person)
{
int b = 0;
}
public List<Person> GetAllContacts()
{
List<Person> lstPerson = new List<Person>();
for (int i = 0; i < 10; i++)
{
Person p = new Person();
p.PersonId = i.ToString();
p.PersonName = i + "Person";
lstPerson.Add(p);
}
return lstPerson;
}
public void DeleteProduct(string id)
{
int c = 0;
}
public void UploadFile( System.IO.Stream stream)
{
object obj = stream;
}
}
Call Rest service using WebRequest :
class Program
{
static void Main(string[] args)
{
new Program().GetContacts();
//new Program().AddContacts();
//new Program().Update();
//new Program().Delete();
}
public void GetContacts()
{
WebRequest req = WebRequest.Create(@"http://localhost:60517/Service1.svc/");
req.Method = "GET";
HttpWebResponse resp = req.GetResponse() as HttpWebResponse;
if (resp.StatusCode == HttpStatusCode.OK)
{
using (Stream respStream = resp.GetResponseStream())
{
StreamReader reader = new StreamReader(respStream, Encoding.UTF8);
Console.WriteLine(reader.ReadToEnd());
}
}
else
{
Console.WriteLine(string.Format("Status Code: {0}, Status Description: {1}", resp.StatusCode, resp.StatusDescription));
}
Console.Read();
}
public void AddContacts()
{
WebRequest req = WebRequest.Create(@"http://localhost:60517/Service1.svc/create");
req.Method = "POST";
req.ContentType = @"application/xml; charset=utf-8";
WriteProductXml(req, "11", "Asif");
HttpWebResponse resp = req.GetResponse() as HttpWebResponse;
Console.WriteLine(string.Format("Status Code: {0}, Status Description: {1}", resp.StatusCode, resp.StatusDescription));
Console.Read();
}
public static void WriteProductXml(WebRequest req, string name, string description)
{
StringBuilder builder = new StringBuilder();
builder.AppendLine("<Person>");
builder.AppendLine("<PersonId>" + description + "</PersonId>");
builder.AppendLine("<PersonName>" + name + "</PersonName>");
builder.AppendLine("</Person>");
req.ContentLength = Encoding.UTF8.GetByteCount(builder.ToString());
using (Stream stream = req.GetRequestStream())
{
stream.Write(Encoding.UTF8.GetBytes(builder.ToString()), 0, Encoding.UTF8.GetByteCount(builder.ToString()));
}
}
public void Update()
{
WebRequest req = WebRequest.Create(@"http://localhost:60517/Service1.svc/1");
req.Method = "PUT";
req.ContentType = @"application/xml; charset=utf-8";
WriteProductXmlUpdate(req, "11", "Asif");
HttpWebResponse resp = req.GetResponse() as HttpWebResponse;
Console.WriteLine(string.Format("Status Code: {0}, Status Description: {1}", resp.StatusCode, resp.StatusDescription));
Console.Read();
}
public static void WriteProductXmlUpdate(WebRequest req, string name, string description)
{
StringBuilder builder = new StringBuilder();
builder.AppendLine("<Person>");
builder.AppendLine("<PersonId>" + description + "</PersonId>");
builder.AppendLine("<PersonName>" + name + "</PersonName>");
builder.AppendLine("</Person>");
req.ContentLength = Encoding.UTF8.GetByteCount(builder.ToString());
using (Stream stream = req.GetRequestStream())
{
stream.Write(Encoding.UTF8.GetBytes(builder.ToString()), 0, Encoding.UTF8.GetByteCount(builder.ToString()));
}
}
public void Delete()
{
WebRequest req = WebRequest.Create(@"http://localhost:60517/Service1.svc/1");
req.Method = "DELETE";
HttpWebResponse resp = req.GetResponse() as HttpWebResponse;
Console.WriteLine(string.Format("Status Code: {0}, Status Description: {1}", resp.StatusCode, resp.StatusDescription));
Console.Read();
}
}