новый FormData () "application / x-www-form-urlencoded" - PullRequest
10 голосов
/ 25 сентября 2011

Приложение Couchdb только для анализа Есть ли атрибут FormData (), который устанавливает энктип?

xhr.open('put',document.myForm.action,false)
xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded')
xhr.send(new FormData(document.myForm))

Ответы [ 3 ]

18 голосов
/ 13 августа 2016

FormData всегда будет отправляться как multipart/form-data.

Если вы хотите отправить FormData как x-www-form-urlencoded, закодируйте элементы содержимого:

function urlencodeFormData(fd){
    var s = '';
    function encode(s){ return encodeURIComponent(s).replace(/%20/g,'+'); }
    for(var pair of fd.entries()){
        if(typeof pair[1]=='string'){
            s += (s?'&':'') + encode(pair[0])+'='+encode(pair[1]);
        }
    }
    return s;
}

var form = document.myForm;
xhr.open('POST', form.action, false);
xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded')
xhr.send(urlencodeFormData(new FormData(form)));

вы также можете использовать URLSearchParams , например:

function urlencodeFormData(fd){
    var params = new URLSearchParams();
    for(var pair of fd.entries()){
        typeof pair[1]=='string' && params.append(pair[0], pair[1]);
    }
    return params.toString();
}

Для старых браузеров, которые не поддерживают URLSearchParams API, вы можете использовать один из полизаполнений:

8 голосов
/ 16 ноября 2011

Нет, метод *1001* XHR2 задан так, чтобы всегда отправлять объекты FormData как multipart / form-data.

Как подсказывает амперсанд, одним из вариантов будет использование плагина jquery.couch.js , который встроен в каждый экземпляр CouchDB в Futon.

Если вам нравится более общий интерфейс HTTP, Fermata также поддерживает запросы в кодировке URL:

fermata.json(document.myForm.action).put({'Content-Type':"application/x-www-form-urlencoded"}, {...form fields...});

Другой вариант - вместо этого отправлять JSON вашей функции обновления (я полагаю, это URL-адрес действия вашей формы).

Конечно, уловка с любым из них заключается в том, что вам придется самостоятельно извлекать поля формы, поскольку нет простого эквивалента на уровне DOM new FormData(document.myForm), который возвращает объект вместо AFAIK.

0 голосов
/ 14 августа 2016

Некоторое время назад я написал следующую функцию.Он собирает значения форм и кодирует их в кодировке url, поэтому их можно отправлять с типом содержимого application/x-www-form-urlencoded:

function getURLencodedForm(form)
{
  var urlEncode = function(data, rfc3986)
  {
    if (typeof rfc3986 === 'undefined') {
      rfc3986 = true;
    }

    // Encode value
    data = encodeURIComponent(data);
    data = data.replace(/%20/g, '+');

    // RFC 3986 compatibility
    if (rfc3986)
    {
      data = data.replace(/[!'()*]/g, function(c) {
        return '%' + c.charCodeAt(0).toString(16);
      });
    }

    return data;
  };

  if (typeof form === 'string') {
    form = document.getElementById(form);
  }

  var url = [];
  for (var i=0; i < form.elements.length; ++i)
  {
    if (form.elements[i].name != '')
    {
      url.push(urlEncode(form.elements[i].name) + '=' + urlEncode(form.elements[i].value));
    }
  }

  return url.join('&');
}

// Example (you can test & execute this here on this page on stackoverflow)
var url = getURLencodedForm('post-form');
alert(url);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...