Web services 我应该如何开始实现RESTfulWeb服务?

Web services 我应该如何开始实现RESTfulWeb服务?,web-services,rest,tomcat,Web Services,Rest,Tomcat,我的老板让我在我们的一些产品上实现RESTful web服务。我们是一家初创公司,我是唯一一个被分配到这项任务的人 我对web服务一无所知,更不用说RESTful web服务了 所以我想开始 因为我不知道我们提供什么服务,我可以假设以下产品: 用户只需键入一个参数为x和y的url,我的服务就会返回x*y的结果。我想这是一个非常基本的RESTful web服务,对吗?请忽略诸如有多少用户将访问它之类的详细信息。我可以假设很多用户都会使用我们的服务 我如何开始,需要学习什么 我应该在服务器端前面设置

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

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

所以我想开始

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

用户只需键入一个参数为x和y的url,我的服务就会返回x*y的结果。我想这是一个非常基本的RESTful web服务,对吗?请忽略诸如有多少用户将访问它之类的详细信息。我可以假设很多用户都会使用我们的服务

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

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

请给我一些指导和提示

谢谢



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

你没有指定一种语言,这使得它很难实现,但有许多框架可以帮助你实现RESTful服务

对于java来说,一个不错的选择是Jersey(http://jersey.java.net/),既然你提到Tomcat,我想你会使用Java

通过遵循教程,您将构建简单的服务,然后您可以开始增加复杂性

您可能需要阅读以下内容:

了解
REST


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

好消息:只要您声称它是RESTful的,您所做的一切都将是RESTful的。 坏消息:您自己定义服务,因为没有“标准”的RESTful服务方式。自项目1起

如果您的web服务真的像乘法操作一样简单,那么它将是一个位于url yourcompany.com/service/multiply的网页,该url可以包含两个参数,可能是老式的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服务的一种思考方式。

我将从理解什么是RESTful服务开始,因为当您不了解需求时,平台不会有帮助

您可以从阅读以下内容开始:
然后用您决定用WCF REST实现服务的编程语言google RESTful服务

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


    } 
[服务合同]
公共接口IService1
{
[WebGet(UriTemplate=“contact/{PID}”,RequestFormat=WebMessageFormat.Json,ResponseFormat=WebMessageFormat.Json)]
[经营合同]
联系人(字符串PID);
//[WebInvoke(Method=“POST”,UriTemplate=“person”)]
[经营合同]
[WebInvoke(UriTemplate=“/create”,Method=“POST”)]
无效保存联系人(人);
[WebGet(UriTemplate=“/”)///RequestFormat=WebMessageFormat.Json,ResponseFormat=WebMessageFormat.Json)
[经营合同]
列出GetAllContacts();
[经营合同]
[WebInvoke(UriTemplate=“/{id}”,Method=“PUT”)]
void UpdateProduct(字符串id,Person);
[经营合同]
[WebInvoke(UriTemplate=“/{id}”,Method=“DELETE”)]
无效删除产品(字符串id);
[经营合同]
[WebInvoke(UriTemplate=“UploadFile”)]
无效上传文件(流);
}
//如下面的示例所示,使用数据协定将复合类型添加到服务操作中。
[DataContract(名称空间=”)]
公共阶层人士
{
[数据成员]
公共字符串PersonId{get;set;}
[数据成员]
公共字符串PersonName{get;set;}
}
服务实施:
公共类服务1:IService1
{
公众人物GetContact(字符串PID)
{
返回newperson(){PersonId=PID,PersonName=PID+“.Name”};
}
公共联系人(个人)
{
int a=0;
}
public void UpdateProduct(字符串id,个人)
{
int b=0;
}
公共列表GetAllContacts()
{
List lstPerson=新列表();
对于(int i=0;i<10;i++)
{
人员p=新人员();
p、 PersonId=i.ToString();
p、 PersonName=i+“个人”;
增加(p);
}
返回人员;
}
公共产品(字符串id)
{
int c=0;
}
公共无效上载文件(System.IO.Stream)
{
对象obj=流;
}
}
使用WebRequest调用Rest服务:
班级计划
{
静态void Main(字符串[]参数)
{
新程序().GetContacts();
//新程序().AddContacts();
//新程序().Update();
//新程序().Delete();
}
公共联系人()
{
WebRequest req=WebRequest.Create(@)http://localhost:60517/Service1.svc/");
req.Method=“GET”;
HttpWebResponse resp=req.GetResponse()作为HttpWebResponse;
if(resp.StatusCode==HttpStatusCode.OK)
{
使用(Stream respStream=resp.GetResponseStream())
{
StreamReader=新的StreamReader(respStream,Encoding.UTF8);
Console.WriteLine(reader.ReadToEnd())