2

我的老板让我在我们的一些产品上实现一个 RESTful Web 服务。我们是一家初创公司,我是唯一分配给这项任务的人。

我对 Web 服务一无所知,更不用说 RESTful Web 服务了。

所以我想开始。

因为我不知道我们提供什么服务,所以我可以假设以下产品:

用户只需键入带有 x 和 y 参数的 url,我的服务返回 x*y 的结果。我想这是一个非常基本的 RESTful Web 服务,对吧?请忽略有多少用户将访问它等细节。我可以假设很多用户都会得到我们的服务。

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

我应该在服务器端设置一个 Tomcat + 一个 RESTful 托管软件吗?

请给我一些指导和提示。

谢谢


我认为 Google Reader API / Facebook API / Twitter API 是我将要实现的 RESTful 服务的一个很好的例子。谷歌和其他公司是如何做到这一点的?

4

4 回答 4

4

您没有指定语言,这很困难,但是有许多框架可以帮助您创建 RESTful 服务。

对于 java,Jersey (http://jersey.java.net/) 是一个不错的选择,既然您提到了 Tomcat,我假设您将使用 Java。

通过遵循这些教程,您将构建简单的服务,然后您可以开始添加更多的复杂性。

您可能想阅读以下内容:

http://ajaxpatterns.org/RESTful_Service

了解REST.

例如,何时使用 GET、POST 或 PUT,以及出现各种错误时应使用哪些响应代码。

于 2012-06-03T20:56:26.130 回答
1

好消息:只要您声称它是 RESTful,您所做的任何事情都将是 RESTful。坏消息:您有点自己定义服务,因为没有“标准”方式来执行 RESTful 服务。从第 1 项开始。

如果您的 Web 服务真的像乘法运算一样简单,那它将是一个位于 url yourcompany.com/service/multiply 的网页,它可以接受 2 个参数,也许是老式的 GET 方式(GET yourcompany.com/service /multiply?x=7&y=6) 或作为两个 POST 参数,然后生成仅包含一个字符串“42”的响应。现在,随着您的请求变得越来越复杂,您可以将它们格式化为简单的 XML:

<multiply>
  <arg value="6">
  <arg value="7">
</multiply>

和回应

<response value="42"/>

或任何你的感觉。或者也许是 JSON。您还需要确保为每个方法调用指定应使用的 HTTP 方法,并确保它们有意义(例如 PUT 用于上传,DELETE 用于删除)。你明白了。RESTful 不是一种规范,它是一种思考 Web 服务的方式。

于 2012-06-03T20:58:22.280 回答
0

我将从了解什么是 RESTful 服务开始,因为当您不了解需求是什么时,平台将无济于事。

您可以先阅读以下内容: http: //www.ibm.com/developerworks/webservices/library/ws-restful/ ,然后使用您决定实施服务的编程语言搜索 RESTful 服务

于 2012-06-03T22:02:21.170 回答
0

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();
        }


    } 
于 2015-07-23T15:31:00.263 回答