编码请求主体

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

表单编码的请求

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

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

如下所示: find=pizza&zipcode=02134&redius=1km

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

application/x-www-form-urlencoded

MIME 多用途internet邮件扩展类型,对大小写不敏感,传统写法小写

一个栗子

用于HTTP请求的编码对象

/*
 *  编码对象的属性
 *  如果它们是来自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请求结果


此处输入图片的描述
此处输入图片的描述

同样的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);
}

效果如下


此处输入图片的描述
此处输入图片的描述

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');
此处输入图片的描述
此处输入图片的描述
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,905评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,140评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,791评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,483评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,476评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,516评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,905评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,560评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,778评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,557评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,635评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,338评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,925评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,898评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,142评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,818评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,347评论 2 342

推荐阅读更多精彩内容