2012-07-04 30 views
2

在任何人說「重複」之前,我已經查看過類似標題的其他問題,但沒有回答我的具體問題,所以請繼續閱讀!HTTP動詞POST,PUT,DELETE:它們在哪裏得到「處理」

我是一個完整的Web開發新手,但已經開始研究非常基本的HTTP和HTML。我的背景是RPC/SOAP風格的服務和桌面應用程序。事情是我在基本層面上對HTTP本身非常困惑,特別是POST,PUT和DELETE動詞。

我可以理解,GET用於從Web服務器請求一個頁面,但我不明白當你實際上做了其他三個動作動作時會發生什麼。如果您是在Apache或IIS上託管一個網頁,並且您有一個帶有提交按鈕的Web表單,那麼它可能會發送一個POST,其中包含您填寫的表單中的數據......但是,Web服務器會如何處理這個?網頁如何使用PUT和DELETE?打什麼?刪除什麼?它不像你在一個服務上調用某種方法,然後對數據庫執行操作。我認爲像ASP.NET這樣的框架在這​​裏發揮作用,但在香草HTTP/HTML我只是不明白它是如何適合在一起...

我真的完全錯過了這裏的東西......幫助讚賞!

+0

「這取決於」。在Web應用程序的情況下,Web服務器通常將控制權交給Web棧(例如ASP.NET)。但是,對於各種請求(除非截獲),Web服務器將非常高興提供「靜態內容」。通常涉及「映射」和「處理程序」。 – 2012-07-04 01:10:11

+0

閱讀:http://www.apacheweek.com/features/put –

回答

-2

PUT和DELETE請求在大多數標準的Web服務器上都沒有做任何事情 - 它們只會吐出HTTP 405(方法不支持)錯誤。如果不使用JavaScript,也無法從網頁中觸發它們。

至於PUT和DELETE的含義,完全取決於應用程序。通常情況下,PUT嘗試在請求的URL處創建一個實體,並用DELETE刪除請求的元素。 (例如,在一個RESTful wiki中,PUT會創建一個頁面,POST或PATCH將用於編輯頁面,而DELETE將刪除它。)實際上,這些方法並不常用,因爲過載通常更容易GET和POST。

+0

當你說「應用程序」時,你的意思是什麼? 「應用程序」不是Web服務器(Apache還是IIS)嗎? Web服務器如何知道數據庫應該插入/更新/刪除這些實體? – MrLane

+0

「應用程序」是指在Web服務器下部署的Web應用程序或服務。 – duskwuff

0

的問題,你都回答RFC 2616,其中概述了服務器應該如何在POSTPUTDELETE方法反應。每種方法(包括這裏沒有提到的方法)都有自己的要求和建議。如果你看一下HTTP請求的raw text stream,你會注意到通過網絡發送的第一部分數據是HTTP動詞。至於如何在服務器端實現這些方法,這完全取決於您所編程的環境。例如,如果您使用PHP實現您的站點,則可以使用$_SERVER['REQUEST_METHOD']來確定如何處理請求。

0

通常,當您在IIS上託管您的網站(我假設使用ASP .Net MVC)時,您要到服務器端的請求將大部分分爲兩類http動詞,即GETPOST。看看下面提到的ASP .NET MVC代碼。在控制器級別,可以使用任何HTTP動詞雖然裝點我們的行動:

enter image description here

現在,讓我們先了解,如果我們使用的是普通的香草ASP .NET MVC框架(沒有任何Java腳本),那麼爲什麼每個請求只能分爲兩類,即GETPOST

比方說,我在我的網站有一個視圖(又名網頁),負責註冊訪問我網站的新用戶。你會看到如下的控制器代碼:

namespace MvcTestApp.Controllers 
{ 

     // GET: /Account/Register 

     [HttpGet] 
     public ActionResult Register() 
     { 
      return View(); 
     } 

     // 
     // POST: /Account/Register 

     [HttpPost] 
     public ActionResult Register(RegisterModel model) 
     { 
      if (ModelState.IsValid) 
      { 
       // Attempt to register the user 
       try 
       { 
        WebSecurity.CreateUserAndAccount(model.UserName, model.Password); 
        WebSecurity.Login(model.UserName, model.Password); 
        return RedirectToAction("Index", "Home"); 
       } 
       catch (MembershipCreateUserException e) 
       { 
        ModelState.AddModelError("", ErrorCodeToString(e.StatusCode)); 
       } 
      } 

      // If we got this far, something failed, redisplay form 
      return View(model); 
     } 
    } 
} 

您輸入您的瀏覽器的地址欄中的URL http://localhost:9896/Account/Register/在瀏覽器加載寄存器視圖/網頁。這就像對網頁的第一次請求,因此您的瀏覽器會自動默認爲HttpGet謂詞,因爲您首次獲得網頁。因此,在這種情況下,下面的方法與[HttpGet]動詞註解被調用:

[HttpGet] 
    public ActionResult Register() 
    { 
     return View(); 
    } 

現在這一頁上我有一個按鈕,我點擊啓動註冊程序一旦我提供的所有註冊相關的細節。如果你看一下網頁的源,然後你看到下面的HTML代碼的按鈕:

<input type="submit" value="Register" /> 

每當你點擊類型的HTML控件submit其簡單的工作是發佈/提交的更新內容當前頁面到服務器。任何包括input html控件在內的html控件都可以通過瀏覽器進行動詞請求。由於這是一個httpPost對服務器的動詞請求完全相同的URL,所以下面提到的用HttpPost修飾的方法會被調用。 ASP.Net運行時獲得來自客戶端的請求,它實際上是一個HTTP POST請求此信息,並因此決定調用具有[HttpPost]註釋控制器上的以下方法:因此只要是

[HttpPost] 
[AllowAnonymous] 
[ValidateAntiForgeryToken] 
public ActionResult Register(RegisterModel model) 
{ 
    if (ModelState.IsValid) 
    { 
    ..... 
    ..... 
} 

不要在您的視圖/網頁上使用任何JavaScript,您最終會使http獲取(第一次)請求或http post(使用html提交控件)請求。

在CRUD操作之外,創建和更新/修改操作由與[HttpPost]註釋相同的方法處理。

HTTP PUT動詞用於創建/替換資源當兩個以下條件都滿足:

  1. 端點必須冪:所以安全一遍遍重做請求。
  2. URI必須是正在更新的資源的地址。

您可以閱讀關於put vs post here的更多信息。

所以如果你在服務器端的業務場景將能夠管理與HTTP put動詞相關的約束,那麼ASP.NET MVC有一個規定。您可以在控制器內創建一個動作,並使用[HttpPut]對其進行裝飾,並使用來自瀏覽器的http put動詞進行調用。

那麼,即使在您碰巧滿足放置動詞規定的標準的某些場景中,您將無法使用HTTP提交按鈕來調用它。你將不得不求助於Java腳本的XMLHttpRequest(即AJAX調用),使PUT動詞要求如下圖所示:

$.ajax({ 
    url: '/Account/Register', 
    type: 'PUT', 
    success: function(result) { 
     // Do something with the result 
    } 
}); 

此外,各地的HTTP動詞刪除我已經看到人們有明確定義的操作上的用法MVC控制器例如void DeleteUser(int userId)使用http POST動詞調用。

總之,我們可以看到,對於http PUT,POST和DELETE動詞,我們只需在服務器端使用http POST動詞調用動作/方法。我在平常的商業應用程序中沒有遇到過一個場景,我曾經想過用[HttpPut][HttpDelete]來裝飾我的MVC動作。

希望這可以幫助你得到一些澄清。

相關問題