编码请求主体

编码请求主体
HTTP的POST请求包括一个请求主体,将会包含客户端传递给服务器的数据,json

表单编码的请求

HTML表单,当用户提交表单时,表单中的数据将会编码到字符串中,一并伴随着请求发送。
默认状况下HTML表单经过POST方法发送给服务器,而编码后的表单数据为请求主体。api

规则:使用URL编码,使用等号把编码后的名字和值分开,并使用&符号将名/值对分开。

以下所示: find=pizza&zipcode=02134&redius=1km服务器

表单数据编码格式会有一个正式的MIME类型网络

application/x-www-form-urlencoded
MIME 多用途internet邮件扩展类型,对大小写不敏感,传统写法小写

一个栗子

用于HTTP请求的编码对象app

/*
 *    编码对象的属性
 *    若是它们是来自HTML表单的名/值对,使用application/x-www-form-urlencolded
 *    将键值对转换为HTTP的编码方式的一个工具函数
 */

function encodeFormData(data) {
    if (!data) return '';    // 若是传入为空,直接返回字符串
    var pairs = [];    // 保存名/值对
    for(var name in data) {    // 进行遍历
        if (!data.hasOwnProperty(name))    continue;    // 跳过继承属性,指示自身的属性是否具备该值
        if (typeof data[name] === 'function') continue;    // 跳过方法
        var value = data[name].toString();    // 将值转换成字符串
        name = encodeURIComponent(name.replace('%20', '+'));    
        value = encodeURIComponent(value.replace('%20', '+'));
        pairs.push(name + '=' + value);    // 记住名值对
    }

    return pairs.join('&');    // 进行链接
}

上方代码将传入的键值对,转换为url的方式提交函数

function postData(url, data, callback) {
    var request = new XMLHttpRequest();    // 新建一个类
    request.open("post", url);
    request.onreadystatechange = () => {
        if (request.readyState === 4 && callback) {
            callback(request);    // 调用回调函数
        };
        request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
        
    }
    request.send(encodeFormData(data));
}

上方的代码将会发送一个post请求,将键值对转换为标准的url进行提交工具

var e = {e:2222220};
postData('./', e);

查看一下post请求结果
此处输入图片的描述post

一样的get请求编码

function getData(url, data, callback) {
    var request = new XMLHttpRequest();
    request.open('GET', url + '?' + encodeFormData(data));
    request.onreadystatechange = () => {
        if (request.readyState === 4 && callback) {
            callback(request);
        }
    }
    request.send(null);
}

效果以下
此处输入图片的描述url

JSON编码

须要在将其更改成

application/json

便可以进行表单提交

function postJSON(url, data, callback) {
    var request = new XMLHttpRequest();
    request.open('post', url);
    request.onreadystatechange = () => {
        if (request.readystate === 4 && callback) {
            callback(request);
        };
    }
    request.setRequestHeader('Content-Type', 'application/json');
    request.send(JSON.stringify(data))
}

演示以下

psotJSON('./', e);

此处输入图片的描述

XML编码请求

xml文档做为主体的HTTP POST请求

function postQuery(url, what, where, radius, callback) {
    var request = new XMLHttpRequest();    
    request.open('post', url);    // 对指定的url发送POST请求
    request.onreadystatechange = () => {
        if (request.readyState === 4 && callback) callback(request);
    }

    // 下面开始使用XML
    var doc = document.implementation.createDocument('', 'query', null);    // document.implementaton 返回一个DOMImplementation对象,该对象和当前文档的节点没有任何关系(相似于一个虚拟节点)其根节点为qqery 而且没有声明
    var query = doc.documentElement;    // 返回文档的根元素
    var find = doc.createElement('find');    // 建立一个find元素
    query.appendChild(find);    // 让find成为query的子节点
    find.setAttribute('zipcode', where);    // 建立一个属性
    find.setAttribute('radius', radius);    
    find.appendChild(doc.createTextNode(what));    // what做为文本节点,而且设置为find的子节点

    // 如今向服务器发送XML编码的数据
    // 将会自动设置Content-Type头
    request.send(doc);
};

查看结果

postQuery('./', 'hello', 'world', 'world');

打开网络面板查看
此处输入图片的描述

multipart/from-data 请求

当HTML表单包含文件上传元素的时候,表单须要使用二进制上传,即

multipart/form-data

使用post方法发送multipart/form-data请求主体

XHR 为一种简称,全称为XMLHttpRequest

将会以一个字节一个字节发送

function postFormData(url, data, callback) {
    if (typeof FormData === 'undefined') {     // 兼容,判断该api是否存在
        throw new Error('not FormData');
    }

    var request = new XMLHttpRequest();
    request.open('post', url);
    request.onreadystechange = () => {    // 当响应完成的时候,回调函数
        if (request.readyState === 4 && callback)
            callback(request);    // 若是存在,则调用回调函数
    };
    var formdata = new FormData();    // 建立文件上传的类
    for(var name in data) {
        if (!data.hasOwnProperty(name)) continue;    // 跳过继承的属性
        var value = data[name];    // 取值
        if (typeof value === 'function') continue;    // 跳过方法
        // 将其键值对插入节点中
        formdata.append(name, value);    // 添加键值对做为子节点
    }
    // 因为使用FormData将会自动设置头部信息
    // 将键值对做为主体进行发送
    request.send(formdata);
}
postFormData('./', '11111111111111');

此处输入图片的描述

相关文章
相关标签/搜索