资讯专栏INFORMATION COLUMN

编码请求主体

monw3c / 2739人阅读

摘要:编码请求主体的请求包括一个请求主体,将会包含客户端传递给服务器的数据,表单编码的请求表单,当用户提交表单时,表单中的数据将会编码到字符串中,一并伴随着请求发送。默认情况下表单通过方法发送给服务器,而编码后的表单数据为请求主体。

编码请求主体
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");

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/108217.html

相关文章

  • 前端必知必会HTTP请求系列(三)HTTP报文内的http信息

    摘要:报文用于协议交互的信息被称为报文。现在出现的各种首部字段及状态码稍后会阐述。状态码响应报文包含了多个范围的内容使用。如果服务器无法响应范围请求,则会返回状态码和完整的实体内容。 showImg(https://segmentfault.com/img/bVbthNL?w=900&h=500); http报文 用于HTTP协议交互的信息被称为HTTP报文。请求端的http报文叫做请求报文...

    Invoker 评论0 收藏0
  • TCP/IP基础总结性学习(3)

    摘要:状态行包含表明响应结果的状态码,原因短语和版本。这种把实体主体分块的功能称为分块传输编码。如果服务器端无法响应范围请求,则会返回状态码和完整的实体内容。 HTTP 报文内的 HTTP 信息 HTTP 通信过程包括从客户端发往服务器端的请求及从服务器端返回 客户端的响应。 一. HTTP报文 用于 HTTP 协议交互的信息被称为 HTTP 报文。请求端(客户端)的 HTTP 报文叫做...

    xushaojieaaa 评论0 收藏0
  • TCP/IP基础总结性学习(3)

    摘要:状态行包含表明响应结果的状态码,原因短语和版本。这种把实体主体分块的功能称为分块传输编码。如果服务器端无法响应范围请求,则会返回状态码和完整的实体内容。 HTTP 报文内的 HTTP 信息 HTTP 通信过程包括从客户端发往服务器端的请求及从服务器端返回 客户端的响应。 一. HTTP报文 用于 HTTP 协议交互的信息被称为 HTTP 报文。请求端(客户端)的 HTTP 报文叫做...

    UnixAgain 评论0 收藏0
  • HTTP读书笔记——HTTP报文内的HTTP信息

    摘要:报文用于协议交互的信息被称为报文。报文本身是由多行数据构成的字符串文本。首部字段包含表明请求和响应的各种条件和属性的各类首部。报文的主体用于传输请求或响应的实体主体。协议中有一种被称为内容编码的功能也能进行类似的操作。 HTTP报文 用于HTTP协议交互的信息被称为报文。 请求端(客户端)的HTTP报文叫做请求报文,响应端(服务器端)的叫做响应报文。 HTTP报文本身是由多行数据构成...

    Sleepy 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<