Ger*_*ens 11 javascript couchdb
Couchdb只解析application/x-www-form-urlencoded.是否有设置enctype的FormData()属性?
xhr.open('put',document.myForm.action,false)
xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded')
xhr.send(new FormData(document.myForm))
Run Code Online (Sandbox Code Playgroud)
cmc*_*cmc 24
这是一种更简单的方法,不依赖于编写您自己的转换:
const form = document.getElementById('my_form')
fetch(form.action,
{ body: new URLSearchParams(new FormData(form)) })
Run Code Online (Sandbox Code Playgroud)
它利用了这样一个事实:URLSearchParams构造函数可以接受一个FormData对象(我认为任何会迭代值对的对象)并且fetch知道转换URLSearchParams为字符串并正确设置 Content-Type 标头。
cui*_*ing 21
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)));
Run Code Online (Sandbox Code Playgroud)
你也可以像这样使用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();
}
Run Code Online (Sandbox Code Playgroud)
对于不支持URLSearchParams API的旧浏览器,您可以使用polyfill之一:
不,指定XHR2"send"方法始终将FormData对象作为multipart/form-data发送.
正如&ersand所暗示的那样,一种选择是使用内置于Futon中每个CouchDB实例的jquery.couch.js插件.
如果你喜欢更通用的HTTP接口,Fermata也支持URL编码请求:
fermata.json(document.myForm.action).put({'Content-Type':"application/x-www-form-urlencoded"}, {...form fields...});
Run Code Online (Sandbox Code Playgroud)
另一个选择是将JSON发送到您的更新功能(我假设是您的表单的'action'URL).
当然,其中任何一个的诀窍在于你必须自己提取表单字段,因为没有简单的DOM级别等效new FormData(document.myForm)返回一个Object而不是AFAIK.