我应该如何开始实施RESTful Web服务?(How should I start to impl

2019-09-17 18:04发布

我的老板问我,落实我们的一些产品的RESTful Web服务。 我们是一个启动,我分配到这个任务只有一个。

我不知道网络服务什么,不说也罢RESTful Web服务。

所以我想上手。

因为我不能告诉我们提供什么样的服务,我能承担这个以下产品:

用户只需输入x和y的参数中的URL,我的服务返回X * Y的结果。 我想这是一个非常基本的RESTful Web服务,对不对? 请忽略像许多用户将如何访问它的细节。 我可以承担很多用户都会有我们的服务。

我该如何开始和我需要什么学?

我应该成立一个Tomcat +前在服务器端REST风格的托管软件?

请给我一些指导和提示。

谢谢


我认为,谷歌阅读器API / Facebook的API / Twitter的API是REST式服务,我要实现的一种很好的例子。 谷歌和其他公司是如何做到这一点?

Answer 1:

你没有指定语言,这使得它很难,但也有很多框架,可以帮助你做出一个RESTful服务。

对于Java一个很好的一个是泽西(http://jersey.java.net/),既然你提到的Tomcat我假设你会使用Java。

按照教程,你将建立简单的服务,然后你就可以开始添加更多的复杂性。

您可能需要阅读本:

http://ajaxpatterns.org/RESTful_Service

得到的想法REST

例如,当使用GET,POST或PUT,例如,当有各种错误,你应该使用什么响应代码。



Answer 2:

好消息是:无论你做什么,你声称它是将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服务的方式。



Answer 3:

我会了解什么是RESTful服务,因为平台无助的时候你不明白的要求是什么开始。

你可以阅读这篇开始: http://www.ibm.com/developerworks/webservices/library/ws-restful/然后只是谷歌基于REST的服务与您决定实施服务的编程语言



Answer 4:

简单的例子与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();
        }


    } 


文章来源: How should I start to implement RESTful web service?