Использование метода PUT в форме HTML - PullRequest
139 голосов
/ 08 ноября 2011

Можно ли использовать метод PUT в форме HTML для отправки данных из формы на сервер?

Ответы [ 6 ]

169 голосов
/ 08 ноября 2011

Согласно стандарту HTML , вы можете , а не . Единственными допустимыми значениями для атрибута метода являются get и post, соответствующие методам GET и POST HTTP. <form method="put"> является недопустимым HTML и будет рассматриваться как <form>, то есть отправлять запрос GET.

Вместо этого многие фреймворки просто используют параметр POST для туннелирования метода HTTP:

<form method="post" ...>
  <input type="hidden" name="_method" value="put" />
...

Конечно, это требует развертывания на стороне сервера.

102 голосов
/ 08 ноября 2011

XHTML 1.x формы поддерживают только GET и POST.GET и POST - единственные допустимые значения для атрибута «method».

41 голосов
/ 08 ноября 2011

Могу ли я использовать метод "Put" в html-форме для отправки данных с HTML-формы на сервер?

Да, можно, но имейте в виду, что это не приведет к PUTно запрос GET.Если вы используете недопустимое значение для атрибута method тега <form>, браузер будет использовать значение по умолчанию get.

HTML-форм (до HTML версии 4 (, 5Черновик) и XHTML 1) поддерживают только GET и POST как методы HTTP-запроса.Обходной путь для этого состоит в том, чтобы туннелировать другие методы через POST, используя скрытое поле формы, которое читается сервером, и запрос отправляется соответственно. XHTML 2.0 когда-то планировалось поддерживать GET, POST, PUT и DELETE для форм, но это входит в XHTML5 из HTML5 , который не планирует поддерживать PUT. [обновить до]

В качестве альтернативы вы можете предложить форму, но вместо ее отправки создайте и выполните XMLHttpRequest, используя метод PUT с JavaScript.

17 голосов

_method обходной путь скрытого поля

В нескольких веб-фреймворках используется следующая простая техника:

  • добавление скрытого _method параметр для любой формы, которая не является GET или POST:

    <input type="hidden" name="_method" value="PUT">
    

    Это можно сделать автоматически в каркасах с помощью вспомогательного метода создания HTML.

  • исправить фактическоеметод form для POST (<form method="post")

  • обрабатывает _method на сервере и делает точно так, как если бы этот метод был отправлен вместо фактического POST

Вы можете достичь этого за:

  • Рельсы: form_tag
  • Laravel: @method("PATCH")

Обоснование / история почемув чистом HTML это невозможно: https://softwareengineering.stackexchange.com/questions/114156/why-there-are-no-put-and-delete-methods-in-html-forms

8 голосов
/ 03 декабря 2016

К сожалению, современные браузеры не предоставляют встроенную поддержку запросов HTTP PUT. Чтобы обойти это ограничение, убедитесь, что атрибут метода HTML-формы имеет значение «post», а затем добавьте параметр переопределения метода в HTML-форму следующим образом:

<input type="hidden" name="_METHOD" value="PUT"/>

Для проверки ваших запросов вы можете использовать "Почтальон" расширение Google Chrome

0 голосов
/ 19 февраля 2019

Чтобы установить методы PUT и DELETE, я выполняю следующее:

<form
  method="PUT"
  action="domain/route/param?query=value"
>
  <input type="hidden" name="delete_id" value="1" />
  <input type="hidden" name="put_id" value="1" />
  <input type="text" name="put_name" value="content_or_not" />
  <div>
    <button name="update_data">Save changes</button>
    <button name="remove_data">Remove</button>
  </div>
</form>
<hr>
<form
  method="DELETE"
  action="domain/route/param?query=value"
>
  <input type="hidden" name="delete_id" value="1" />
  <input type="text" name="delete_name" value="content_or_not" />
  <button name="delete_data">Remove item</button>
</form>

Затем JS выполняет необходимые методы:

<script>
   var putMethod = ( event ) => {
     // Prevent redirection of Form Click
     event.preventDefault();
     var target = event.target;
     while ( target.tagName != "FORM" ) {
       target = target.parentElement;
     } // While the target is not te FORM tag, it looks for the parent element
     // The action attribute provides the request URL
     var url = target.getAttribute( "action" );

     // Collect Form Data by prefix "put_" on name attribute
     var bodyForm = target.querySelectorAll( "[name^=put_]");
     var body = {};
     bodyForm.forEach( element => {
       // I used split to separate prefix from worth name attribute
       var nameArray = element.getAttribute( "name" ).split( "_" );
       var name = nameArray[ nameArray.length - 1 ];
       if ( element.tagName != "TEXTAREA" ) {
         var value = element.getAttribute( "value" );
       } else {
       // if element is textarea, value attribute may return null or undefined
         var value = element.innerHTML;
       }
       // all elements with name="put_*" has value registered in body object
       body[ name ] = value;
     } );
     var xhr = new XMLHttpRequest();
     xhr.open( "PUT", url );
     xhr.setRequestHeader( "Content-Type", "application/json" );
     xhr.onload = () => {
       if ( xhr.status === 200 ) {
       // reload() uses cache, reload( true ) force no-cache. I reload the page to make "redirects normal effect" of HTML form when submit. You can manipulate DOM instead.
         location.reload( true );
       } else {
         console.log( xhr.status, xhr.responseText );
       }
     }
     xhr.send( body );
   }

   var deleteMethod = ( event ) => {
     event.preventDefault();
     var confirm = window.confirm( "Certeza em deletar este conteúdo?" );
     if ( confirm ) {
       var target = event.target;
       while ( target.tagName != "FORM" ) {
         target = target.parentElement;
       }
       var url = target.getAttribute( "action" );
       var xhr = new XMLHttpRequest();
       xhr.open( "DELETE", url );
       xhr.setRequestHeader( "Content-Type", "application/json" );
       xhr.onload = () => {
         if ( xhr.status === 200 ) {
           location.reload( true );
           console.log( xhr.responseText );
         } else {
           console.log( xhr.status, xhr.responseText );
         }
       }
       xhr.send();
     }
   }
</script>

После определения этих функций я добавляю событиеслушатель кнопок, которые делают запрос метода формы:

<script>
  document.querySelectorAll( "[name=update_data], [name=delete_data]" ).forEach( element => {
    var button = element;
    var form = element;
    while ( form.tagName != "FORM" ) {
      form = form.parentElement;
    }
    var method = form.getAttribute( "method" );
    if ( method == "PUT" ) {
      button.addEventListener( "click", putMethod );
    }
    if ( method == "DELETE" ) {
      button.addEventListener( "click", deleteMethod );
    }
  } );
</script>

и кнопки удаления в форме PUT:

<script>
  document.querySelectorAll( "[name=remove_data]" ).forEach( element => {
    var button = element;
    button.addEventListener( "click", deleteMethod );
</script>

_ - - - - - - - - - --

Эта статья https://blog.garstasio.com/you-dont-need-jquery/ajax/ очень мне помогает!

Помимо этого, вы можете установить функции postMethod и getMethod для обработки методов отправки POST и GET, как вам нравится, вместо поведения браузера по умолчанию.,Вместо этого вы можете делать все, что захотите, используя location.reload(), например, показывать сообщение об успешном изменении или успешном удалении.

= - = - = - = - = - = - = - = - = - = - = -= - = - = - = - = - = - = -

JSFiddle: https://jsfiddle.net/enriquerene/d6jvw52t/53/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...