new FormData()"application/x-www-form-urlencoded"

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之一:


nat*_*evw 8

不,指定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.