全手打原创,转载请标明出处:https://www.cnblogs.com/dreamsqin/p/10946165.html,多谢,=。=~

术语

HTTP:超文本传输协议,规定Web浏览器如何从Web服务器获取文档和向Web服务器提交表单内容,以及Web服务器如何响应这些请求和提交;

(HTTP不在脚本控制下,只当用户点击链接、提交表单、输入URL时发生。但是js可操纵HTTP,例如设置window对象的location属性、调用表单的submit()方法会初始化HTTP请求,页面会重新加载。)

Ajax:使用脚本操纵HTTP的Web应用架构,实现与Web服务器的数据交换,不会导致页面重载,客户端从服务器“拉”数据,可利用XMLHttpRequest对象实现;

Comet:使用脚本操纵HTTP的Web应用架构,与Ajax相反,服务器向客户端“推”数据,可利用EventSource对象实现;

XMLHttpRequest:定义了用脚本操纵HTTP的API;

(XMLHttpRequest对象支持包括XML在内的任何基于文本的格式,能用于HTTP和HTTPS请求,涉及HTTP请求或响应的所有活动)

XMLHttpRequest的使用

实例化(IE7及以后):

var request = new XMLHttpRequest();

模拟XMLHttpRequest构造函数(IE5、IE6):

if (window.XMLHttpRequest === undefined) {
window.XMLHttpRequest = function() {
try {
return new ActiveXObject("MSXML2.XMLHttp.6.0");
}
catch (e1) {
try {
return new ActiveXObject("MSXML2.XMLHttp.3.0");
}
catch (e2) {
throw new Error("XMLHttpRequest is not supported");
}
}
}
}

HTTP请求(请求的方法或动作、请求的URL、请求头、请求体):

request.open("GET", "/log.php");    // 请求的方法、URL
request.setRequestHeader("Content-Type", "text/plain;charset=UTF-8"); // 请求头
request.send(null); // 请求体

HTTP响应(数字+文字的状态码、响应头、响应体):

request.onreadystatechange = function() {
// HTTP的请求状态readyState
// 0:open尚未调用
// 1:open已调用
// 2:接收到头信息
// 3:接收到响应主体
// 4:响应完成 // HTTP状态码status
// 2xx:代表请求已成功被服务器接收、理解、并接受
if(request.readyState === 4 && request.status === 200) {
// responseText属性:MIME类型的文本响应,如:text/css
// responseXML属性:Document对象类型,如:XML、XHTML
console.log(request.responseText);
}
};

响应解码

request.onreadystatechange = function() {
if (request.readyState === 4 && request.status === 200) {
var type = request.getResponseHeader("Content-type");
if (type.indexOf("xml") !== -1 && request.responseXML) {
console.log(request.responseXML); // Document对象响应
} else if (type === "application/json"){
console.log(JSON.parse(request.responseText)); // Json响应
} else {
console.log(request.responseText); // 字符串响应
}
}
};

请求主体编码(POST请求)

1、表单编码(对名字和值进行URL编码(即使用十六进制转义码替换特殊字符)、使用=分开编码后的名字和值、使用&连接名/值对)

PS:<input type="submit">定义用于向表单处理程序(form-handler)提交表单的按钮,自带表单编码功能。

POST请求必须设置请求头:

request.open("POST",url);
request.setRequestHeader("Content-type","application/x-www-form-urlencoded");
request.send(encodeFormData(data));

GET请求只需跟在url连接后即可:

request.open("GET", url + "?" + encodeFormData(data));
request.send(null);

表单编码函数encodeFormData:

// 对象属性的表单编码
function encodeFormData(data) {
if (!data) return ""; // 如果data非对象则返回空字符串
var paris = []; // 保存名=值对
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%", "+")); // 编码值
paris.push(name + "=" +value);
}
return paris.join("&"); // 使用"&"连接名/值对
}

2、JSON编码(使用JSON.stringify()方法)

request.open("POST",url);
request.setRequestHeader("Content-type","application/json");
request.send(JSON.stringify(data));

3、XML编码(send方法中传递XML Document对象)

<query>
<find zipcode="02134" radius="1km">
pizza
</find>
</query>
function createXML(what, where, radius) {
// Create an XML document with root element <query>
var doc = document.implementation.createDocument("", "query", null);
var query = doc.documentElement; // <query>元素
var find = doc.createElement("find"); // 创建<find>元素
query.appendChild(find); // 把<find>添加至<query>中
find.setAttribute("zipcode", where); // 设置<find>的属性
find.setAttribute("radius", radius);
find.appendChild(doc.createTextNode(what)); // 设置<find>的内容
return doc;
} // 会自动设置Content-type头
request.send(createXML("pizza", "02134", "1km"));

4、文件上传

HTML表单<input type="file">始终能上传文件;XMLHTTPRequest无法实现;XHR2可以通过向send()方法传入File对象实现(文件类型是更通用的二进制大对象Blob类型中的一个子类型)。

5、multipart/form-data请求

当HTML表单同时包含文件上传元素和其他元素时,必须使用Content-type为multipart/form-data的特殊方式提交表单,该编码使用长“边界”字符串把请求主体分离成多个部分。

XHR2定义了新的FormData API,容易实现多部分请求主体(使用FormData()构造函数创建FormData对象,然后按需多次调用这个对象的append()方法把个体的“部分”(字符串、File或Blob对象)添加到请求中)。

function createFormData(data) {
if (typeof FormData === "undefined") {
throw new Error("FormData is not implemented");
}
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);
}
return formData;
} request.send(createFormData({user: "aaa", text: "bbb"}));

HTTP请求无法完成的3种情况

1、timeout事件:请求超时;

2、abort事件:请求中止;

3、error事件:比如太多重定向这样的网络错误会阻止请求完成;

一点对原生HTTP请求的理解与总结的更多相关文章

  1. tornado异步请求的理解(转)

    tornado异步请求的理解 http://www.kankanews.com/ICkengine/archives/88953.shtml 官网第一段话: Tornado is a Python w ...

  2. swift3.0 原生GET请求 POST同理

    swift3.0 原生GET请求  POST同理 func getrequest(){ let url = URL(string: "http://117.135.196.139:" ...

  3. 原生http请求封装

    满血复活,今天开始开始更新博客.随着es6的普遍应用,promise属性也随之用之普遍,我们在一些项目中,为了避免引入一些http库,节省空间,就简单将原生http请求做了封装处理,封装代码如下:(其 ...

  4. 原生AJAX请求教程

    ajax 即 Asynchronous Javascript And XML,AJAX 不是一门的新的语言,而是对现有持术的综合利用.本质是在 HTTP 协议的基础上以异步的方式与服务器进行通信. 异 ...

  5. Servlet处理原生Ajax请求

    萌新小白人生中的第一篇博客,难免会有差错,还望各位大佬多多包涵. 1. Ajax技术简介      Ajax(Asynchronous JavaScript and XML,异步JavaScript和 ...

  6. 原生 ajax 请求

    ajax 即 Asynchronous Javascript And XML,AJAX 不是一门的新的语言,而是对现有持术的综合利用.本质是在 HTTP 协议的基础上以异步的方式与服务器进行通信. 异 ...

  7. drf复习(一)--原生djangoCBV请求生命周期源码分析、drf自定义配置文件、drf请求生命周期dispatch源码分析

    admin后台注册model  一.原生djangoCBV请求生命周期源码分析 原生view的源码路径(django/views/generic/base.py) 1.从urls.py中as_view ...

  8. 学一点 mysql 双机异地热备份----快速理解mysql主从,主主备份原理及实践

    双机热备的概念简单说一下,就是要保持两个数据库的状态 自动同步.对任何一个数据库的操作都自动应用到另外一个数据库,始终保持两个数据库数据一致. 这样做的好处多. 1. 可以做灾备,其中一个坏了可以切换 ...

  9. get与post请求简单理解

    一般在浏览器中输入网址访问资源都是通过GET方式:在FORM提交中,可以通过Method指定提交方式为GET或者POST,默认为GET提交 Http定义了与服务器交互的不同方法,最基本的方法有4种,分 ...

随机推荐

  1. 面试题: 数据库笔试 sql操作 已看 上课的练习题50sql

    2018/5/31 oracle数据库面试笔试试题总结http://www.yjbys.com/qiuzhizhinan/show-308759.html 1/4Oracle数据库1.基础测试选择在部 ...

  2. MVN&nbsp;命令行

    Maven依赖查询: http://mvnrepository.com/ Maven常用命令:  1. 创建Maven的普通java项目:     mvn archetype:create     - ...

  3. HDU 3549 Flow Problem (最大流ISAP)

    Flow Problem Time Limit: 5000/5000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Tota ...

  4. 2. DVWA亲测文件包含漏洞

    Low级:     我们分别点击这几个file.php文件 仅仅是配置参数的变化: http://127.0.0.1/DVWA/vulnerabilities/fi/?page=file3.php 如 ...

  5. Thinkphp3.2 下载文件的方法

    今天做一个功能,刚好遇到了一个要下载文件功能的需求,所以把这个基于thinkphp3.2的文件下载功能,描述一下大概的实现方法. 网上有人说用a链接的方法实现,但是这种方法并不安全.所以我们还是用官方 ...

  6. 使用gRPC搭建Server端与Client端

    gRPC简介 gRPC是一种RPC框架技术,采用Protocal Buffers(协议缓存) 作为其接口定义的语言(就是Proto来写接口)和基础的消息交换格式. 在gRPC中,客户端应用程序可以直接 ...

  7. 洛谷P4768 [NOI2018]归程(克鲁斯卡尔重构树+最短路)

    传送门 前置技能,克鲁斯卡尔重构树 我们按道路的高度建一个最大生成树,然后建好克鲁斯卡尔重构树 那么我们需要知道一颗子树内到1点距离最近是多少(除此之外到子树内任何一个点都不需要代价) 可以一开始直接 ...

  8. nodejs动态路由

    主要功能:根据输入路由的不同,加载访问不同的HTML页面 在这里我不得不说webstorm真的是一个很棒的开发工具,我学习nodejs也是用的它. 文件目录: first_server.js: 首先我 ...

  9. Spark 学习(二)

    继续学习spark 认真查看了一下${SPARK_HOME}/bin/pyspark 的脚本,原来开启spark 的python 交互挺简单的. 主要操作 export PYTHONPATH=${SP ...

  10. jQuery EasyUI/TopJUI创建日期时间输入框

    jQuery EasyUI/TopJUI创建日期时间输入框 日期时间输入框组件 HTML 和日期输入框类似,日期时间输入框允许用户选择日期和指定的时间并按照指定的输出格式显示.相比日期输入框,它在下拉 ...