2012-06-03 4 views
2

Мой босс попросил меня внедрить веб-сервис RESTful на некоторые из наших продуктов. Мы стартап, и я единственный, кто назначен на эту задачу.Как мне начать внедрять веб-службу RESTful?

Я ничего не знаю о веб-сервисе, не говоря уже о веб-сервисе RESTful.

Так что я хочу начать.

Потому что я не могу сказать, что обслуживание мы обеспечиваем, я могу предположить, это следующий продукт:

Пользователь просто введите URL с параметром х и у, и моя служба возвращает результат х * у. Я предполагаю, что это очень простой веб-сервис RESTful, не так ли? Пожалуйста, игнорируйте данные, например, сколько пользователей получит к нему доступ. Я могу предположить, что у многих пользователей будет наш сервис.

Как мне начать и что мне нужно узнать?

Должен ли я настроить Tomcat + RESTful хостинг-программное обеспечение спереди на стороне сервера?

Пожалуйста, дайте мне руководство и подсказки.

Благодаря


Я думаю, что Google Reader API/Facebook API/Twitter API является своего рода хорошим примером для RESTful службы я собираюсь реализовать. Как Google и другие компании достигли этого?

+0

Вы можете использовать это, Джексон: http://jackson.codehaus.org/ – Gavriel

+0

@Gavriel что вы имеете в виду? Мне нужно сложнее, чем отправлять json. –

+0

серьезно, я думаю, вам стоит искать какой-то учебник или примерный проект. Если я получу это из ваших вопросов, вам понадобятся некоторые примеры базового веб-программирования. Выполнение x * y не будет проблемой, когда вы доберетесь – Gavriel

ответ

4

Вы не указали язык, который делает его жестким, но существует множество фреймворков, которые могут помочь вам в создании службы RESTful.

Для java хороший один - Джерси (http://jersey.java.net/), и, поскольку вы упоминаете Tomcat, я предполагаю, что вы будете использовать Java.

Следуя учебным пособиям, вы создадите простые службы, а затем можете добавить дополнительную сложность.

Вы можете прочитать:

http://ajaxpatterns.org/RESTful_Service

, чтобы получить представление о REST.

Например, когда использовать GET, POST или PUT, например, и какие коды ответов вы должны использовать, когда есть различные ошибки.

1

Хорошая новость: все, что вы делаете, будет RESTful, пока вы утверждаете, что это так. Плохая новость: вы сами по себе определяете услугу, потому что нет «стандартного» способа выполнения службы RESTful. Поскольку пункт 1.

Если ваш веб-сервис действительно так просто, как multiplcation операции, что было бы веб-страница живой на URL-адрес yourcompany.com/service/multiply который может принимать 2 аргумента, возможно, Староновая (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 для uploads, DELETE для удаления). Вы получаете идею. RESTful - это не спецификация, это способ мышления о веб-сервисах.

+0

Я не могу согласиться с этим: есть принципы, лежащие в основе REST, и ни один веб-API не может утверждать, что это RESTful. Даже если, к сожалению, большинство из них ... См. Http://en.wikipedia.org/wiki/Representational_state_transfer#Guiding_principles_of_the_interface и http://kellabyte.com/2011/09/04/clarifying-rest/ – jmclem

+0

Большинство из них делают потому что они могут. –

+0

ОК, согласен; «многие из них». – jmclem

0

Я бы начал с понимания того, что такое служба RESTful, потому что платформы не помогут, когда вы не понимаете, что это за требования.

вы можете начать с прочтения этого: http://www.ibm.com/developerworks/webservices/library/ws-restful/ , а затем просто Google RESTful службы с языком программирования вы решили реализовать ваш сервис-

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


    } 
Смежные вопросы