2013-02-03 33 views
4

那麼,我知道互聯網工作的基本思想:客戶端發送請求,服務器發送迴應。 但我試圖開發一個rails應用程序,我遇到了像RESTful體系結構,http請求(GET,POST等),xhr請求。所以,我認爲如果有人能夠詳細解釋這些事情是什麼以及他們如何在CRUD網絡應用程序中聚合在一起,這將是非常棒的。動態網絡應用程序如何工作?

+0

我認爲你的問題「動態網絡應用程序如何工作」是一個與你的問題建議的細節不同的問題。一個動態的Web應用程序描述http://www.serverwatch.com/tutorials/article.php/2199701/What-does-Dynamic-Web-Application-Really-Mean-.htm不需要你列出的功能(寧靜, xhr請求等) – Thronk

回答

6

好的我會給這個鏡頭:

爲什麼要使用RESTful架構?

對於現在的很多Web應用程序,人們正在數據庫和應用程序之間建立一個REST API。

REST API向Web應用程序提供數據,可以在服務器端(在向用戶發送頁面之前)或在客戶端(在用戶下載頁面之後)調用它。

它也可以被未來的項目利用。例如,想象你的網站起飛,你也想要一個原生的移動應用程序。您可以重新使用現有的REST API來完成此操作。

HTTP動詞

很長一段時間的唯一HTTP動詞使用(http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods)大多數Web開發者們GET和POST。

處理數據的REST服務擴展了現有的HTTP動詞,通常沒有太多的動作。所以如果你想用REST調用刪除一個對象,你可以使用DELETE動詞作爲例子。

HTTP動詞只是爲您的REST服務提供更直觀的數據操作方式。

XHR請求

XHR請求(http://en.wikipedia.org/wiki/XMLHttpRequest) - 僅僅是一個做一個AJAX調用的方式。這個想法是,客戶端(獲取您的網頁的人)將直接調用您的REST服務。

雖然最大的區別是調用是在「後臺」 - 換句話說 - 沒有頁面刷新。想想Gmail在你收到新電子郵件時的工作原理。您沒有注意到整個頁面在瀏覽器中刷新。它只是提供更好的用戶體驗。

他們如何一起工作?

現在在製作Web應用程序時,通常會有一個REST服務/ API來爲數據庫中的數據提供服務。然後,當從Web應用程序訪問REST服務時,可以決定是否要將這些調用服務器端(從Java/C#/ Ruby /無論)還是從客戶端(Javascript)調用。

每種方法都存在挑戰,但希望有所幫助。

+0

作爲對此答案的補充,請注意您的應用程序也可以是RESTful(而不僅僅是您的API),並且在面向資源的體系結構中,用戶應用程序和API都是兩種表示形式相同的資源。這很難用幾行來解釋,但是有很多關於這方面的書籍,如:L. Richardson,S. Ruby。 REST風格的Web服務。 O'Reilly,2007年。 –

0

我無法直接回答您的問題。但是,客戶端 - 服務器關係可能非常簡單。前段時間我試着理解它是如何在實踐中發揮作用的,並從Java Perspective中做了這個。所以寫了一些代碼,我已經使用了一段時間了。基本的想法是,我有某種客戶端應用程序,它在獲得某個日期後發送到服務器,服務器將它保存在一個文件中。也許它可以幫助你瞭解你應該怎麼做你:

客戶端:

  try { 
       // Establish connection with the server 
       Socket socket = new Socket(host, 8000); 

       // Create an output stream to the server 
       ObjectOutputStream toServer =new ObjectOutputStream(socket.getOutputStream()); 
       String playerIPClean=socket.getLocalAddress().getHostAddress(); 
       String s=""; 
# you can put your data here in this string and send everything in this string 
# (afterwords you split the data) 

       toServer.writeObject(s); 
       toServer.close(); 
       socket.close(); 
      } 
      catch (IOException ex) { 
       System.err.println(ex); 
      } 

客戶端發送到發送一個字符串的請求! 服務器端:

 public TheServer() { 
     try { 
      // Create a server socket 
      ServerSocket serverSocket = new ServerSocket(8000); 
      System.out.println("Server started "); 
      PrintWriter outputToFile=null; 
      while (true) { 
      // Listen for a new connection request 
      Socket socket = serverSocket.accept(); 

      // Create an input stream from the socket 
      inputFromClient = 
       new ObjectInputStream(socket.getInputStream()); 

      // Read from input 
      Object object = inputFromClient.readObject(); 
      textContent=object.toString(); 
      textContent=object.toString(); 
      String fileNameComposer; 
      fileNameComposer=fileName+"rew"+reward+"."+expName+"prize"; 
    //  System.out.println(fileName); 
      try{ 
       outputToFile=new PrintWriter(new FileWriter(fileNameComposer)); 
       outputToFile.println(object); 
      } 
      catch (IOException e) { 
       System.err.println("Caught IOException: " 
            + e.getMessage()); 

      } finally { 
       inputFromClient.close(); 
       if (outputToFile != null) { 
        System.out.println("Closing PrintWriter"); 
        outputToFile.close(); 
       } 
       else { 
        System.out.println("PrintWriter not open"); 
       } 
      } 


      System.out.println("A new object is stored"); 
//   System.out.println(object); 
      } 
     } 
     catch(ClassNotFoundException ex) { 
      ex.printStackTrace(); 
     } 
     catch(IOException ex) { 
      ex.printStackTrace(); 
     } 
     finally { 

      try { 
//   inputFromClient.close(); 
    //  outputToFile.close(); 
      } 
      catch (Exception ex) { 
      ex.printStackTrace(); 
      } 
     } 
     } 

關當然,服務器應用程序應連續運行接受任何(我花了一些時間來了解這一點)。服務器接受請求,接收該字符串並將其保存。這個想法在Java中很容易。實際上,梁的Java書幫助我理解了Java中的這些東西。

相關問題