Couchdb只解析application / x-www-form-urlencoded。是否有一个FormData()属性设置了enctype?
xhr.open('put',document.myForm.action,false)
xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded')
xhr.send(new FormData(document.myForm))
答案 0 :(得分:17)
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的旧版浏览器,您可以使用其中一个polyfill:
答案 1 :(得分:8)
不,指定XHR2 "send" method始终将FormData对象作为multipart / form-data发送。
正如&ampersand所暗示的,一种选择是使用内置于Futon中每个CouchDB实例的jquery.couch.js插件。
如果您喜欢更通用的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)
返回一个Object而不是AFAIK。
答案 2 :(得分:0)
前段时间我写了以下功能。它收集表单值并将其编码为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);