2012-07-04 2 views
2

Прежде чем кто-нибудь скажет «дубликат», я просмотрел другие вопросы с похожими заголовками, и никто не ответил на мой конкретный вопрос, поэтому, пожалуйста, прочитайте!HTTP-глаголы POST, PUT, DELETE: Где эти «обрабатываются»

Я полный новичок в разработке веб-приложений, но начал изучать очень простые HTTP и HTML. Мой фон - это службы стиля RPC/SOAP и настольные приложения. Дело в том, что я действительно очень запутался в самом HTTP-протоколе на фундаментальном уровне, в частности, в POST, PUT и DELETE.

Я могу понять, что GET используется для запроса страницы с веб-сервера, но я не понимаю, что происходит, когда вы на самом деле выполняете любые другие три действия глагола. Если вы размещаете веб-страницу в Apache или IIS, и у вас есть веб-форма с кнопкой отправки, возможно, она отправит POST с данными, которые вы заполнили в форме ... но что делает веб-сервер с это? Как веб-страница даже использует PUT и DELETE? Что? УДАЛИТЬ, что? Это не похоже на то, что вы вызываете какой-то метод в службе, который затем выполняет действие против базы данных. Я предполагаю, что такие каркасы, как ASP.NET, вступают в игру здесь, но в ванильном HTTP/HTML я просто не понимаю, как он сочетается ...

Я действительно совершенно ничего не вижу здесь ... помогите оценить!

+0

«Это зависит». В случае веб-приложения веб-сервер обычно будет «передавать» управление веб-стеку (например, ASP.NET). Тем не менее, для различных запросов (если они не перехватываются) веб-сервер будет вполне счастлив, обслуживая «статический контент». Часто используются «сопоставления» и «обработчики». –

+0

Читайте это: http://www.apacheweek.com/features/put –

ответ

-2

Запросы PUT и DELETE ничего не делают на большинстве стандартных веб-серверов - они просто вернут ошибку HTTP 405 (метод не поддерживается). Также нет возможности запускать их с веб-страницы без использования Javascript.

Что касается PUT и DELETE, это полностью зависит от приложения. Обычно PUT пытается создать объект по запрошенному URL-адресу, и для DELETE удалять запрашиваемый элемент. (Например, в RESTful wiki PUT создаст страницу, POST или PATCH будут использоваться для редактирования страницы, и DELETE удалит ее.) На практике эти методы обычно не используются, так как часто проще просто перегружать GET и POST.

+0

Когда вы говорите «приложение», что вы имеете в виду конкретно? Не является ли «приложение» веб-сервером (Apache или IIS)? Как сам веб-сервер знает о базе данных, что эти объекты должны быть вставлены/обновлены/удалены в/из? – MrLane

+0

Под «приложением» я имею в виду веб-приложение или службу, развернутую под веб-сервером. – duskwuff

0

Вопросы вы все ответы в RFC 2616, который описывает, как серверы должны реагировать на POST, PUT, DELETE методы. Каждый метод (в том числе не упомянутый здесь) имеет свои собственные требования и предложения. Если вы посмотрите на raw text stream HTTP-запроса, вы заметите, что первая часть данных, которая отправляется по проводу, является HTTP-глаголом. Что касается того, как эти методы реализованы на стороне сервера, это полностью зависит от среды, в которой вы программируете. Например, если вы внедряете свой сайт в PHP, вы можете использовать $_SERVER['REQUEST_METHOD'], чтобы определить, как вы должны обрабатывать запрос.

0

Обычно, когда вы размещаете свой веб-сайт (я предполагаю, что ASP .Net MVC здесь) на IIS, ваши запросы, отправляемые на серверную часть, будут в основном попадать только в две категории http-глаголов: GET или POST. Посмотрите приведенный ниже код ASP.NET MVC. На уровне контроллера можно декорировать свои действия, используя любой из HTTP глаголов, хотя:

enter image description here

Теперь давайте сначала понять, если мы используем обычный ванильный ASP .NET MVC Framework (без Java Script), то почему каждый запрос относится только к двум категориям, а именно GET и POST.

Предположим, у меня есть вид (ака веб-страницы) на моем сайте, который отвечает за регистрацию новых пользователей, посещающих мой сайт.Вы увидите код контроллера, как показано ниже:

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

Вы набираете http://localhost:9896/Account/Register/ URL в адресной строке браузера для загрузки регистра просмотра/веб-страницы в вашем браузере. Это похоже на первый запрос на веб-страницу, поэтому ваш браузер автоматически по умолчанию использует его до HttpGet глагола, когда вы получаете веб-страницу в первый раз. Так что в этом случае ниже метода с аннотацией [HttpGet] глагола вызывается:

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

Теперь на странице У меня есть кнопка, которая, когда я нажимаю, чтобы начать процесс регистрации, как только я предоставил все детали, связанные с регистрацией. Если вы посмотрите на исходный код веб-страницы, то вы видите ниже HTML код для кнопки:

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

Всякий раз, когда вы нажимаете на элемент управления HTML типа submit его простая работа заключается в том, чтобы опубликовать/отправить обновленное содержимое из текущей страницы на сервер. Любой из элементов управления html, включая контроль над html input, который делает запрос на стороне сервера, способен выполнять только HttpPost глагольных запросов через браузер. Так как это запрос httpPost на сервер для точно такого же URL-адреса, вызывается вызываемый ниже метод, который украшен HttpPost. ASP.Net время выполнения получает эту информацию от клиента запроса, что это на самом деле запрос HTTP POST, и, следовательно, решает вызвать метод ниже на контроллере, имеющий [HttpPost] аннотации:

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

Таким образом, до тех пор, как вы не используя какой-либо javascript на вашей странице просмотра/веб-страницы, вы, в конечном счете, делаете запрос http (первый раз) или http-сообщение (используя запрос html submit).

Из операций CRUD операции «Создать и обновить/изменить» обрабатываются тем же методом, который аннотируется с помощью [HttpPost].

HTTP ставить глагол используется для создания/замены ресурса, когда два ниже условий:

  1. конечная точка должна быть тождественной: так безопасно повторить запрос снова и снова.
  2. URI должен быть адресом обновляемого ресурса.

Вы можете прочитать больше о put vs post here.

Итак, если ваш бизнес-сценарий на стороне сервера будет способен управлять ограничениями, связанными с HTTP-глаголом, тогда для ASP.NET MVC предусмотрено это условие. Вы можете создать действие внутри контроллера и украсить его с помощью [HttpPut] и вызвать его, используя HTTP-глагол из браузера.

Ну, даже если в каком-то сценарии, где вы выполняете критерии, установленные глаголом put, вы не сможете вызвать его, используя кнопку отправки HTTP. Вам придется прибегнуть к Java Script XMLHttpRequest (т.е. AJAX вызовов), чтобы положить глагол вызовов, как показано ниже:

$.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-глагола. Я не встречал сценарий в обычных бизнес-приложениях, где я когда-либо думал о том, чтобы украсить мои действия MVC с помощью [HttpPut] или [HttpDelete].

Надеюсь, что это поможет вам получить разъяснения.

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