http 请求 与其同步与异步请求的通透讲解
http请求可以是基于webkit的浏览器或者web组件如:webview(在移动平台,android iOS等)发送的;也可以是任何程序或者代码段发出的;也可以这么说任何程序都可以自主发送http.
http 是超文本传输协议,其是基于tcp/ip协议。本质上首先我们是需要借助系统开启socket监听,然后使用tcp传输协议,传输数据包,将数据包凭借成http request和response,这就成了http协议。但是高级语言给我们封装了这一层。那么我们直接使用接口,无需再去自己开发(如Java,c#, javascrpt,object c)。但是正是因为这样,我们有时候,对http的理解就没有那么深入了。
既然任何程序代码段都可以开发使用http协议发送http请求,那么一般的代码段和webkit(浏览器内核组件)发送http有什么区别吗?我相信很多人回答是没有任何区别。其实本质上没有任何的区别,但是有限制!!! webkit可以让我们http请求一个html页面,但是一般的代码段就不这么做,因为我们拿到html文件也干不了什么,又不能解析展示。
可能此时有人会反驳我,HTML本来就是浏览器页面,因此浏览器可以或者需要请求页面,但是html和一般http请求代码段没有丝毫联系,干嘛要去请求取回http页面呢???其实这样理解也是对的。
既然基于webkit的组件需要拿回来html页面,那么一般组件都会提供直接加载请求html页面的接口,如浏览器 中 提供 window.location window.navigate 或者JavaScript的onload方法。在webview(移动平台)组件提供onload(url)接口。所以我们一般在组件中开发http,一般都是http请求数据包,拿回来解析数据,并非是加载一个新的页面。换句话说我们在组件中使用Javascript或者其他脚本语言开发http是页面上部分的数据交互。
对于其他的程序代码段开发http请求更都是数据的交互。
对于webkit 发送http请求有一个概念就是 异步请求和同步请求。(注意这是对于浏览器b/c架构才有的概念)就是浏览器发送http请求之后,如果数据没有回来,那么浏览器一直是等待状态,那么它什么也不能做。这就是同步请求。相反浏览器发送数据请求之后,其还能做其他的事情,只有当数据回来了再去加载数据,这是异步请求。对于浏览器加载一个新的页面,那么同步与异步没有什么意义了,也就是说同步与异步是针对请求页面部分数据而言的。你想想要是浏览器去加载一个新的页面,还要请求,可能新页面回来了,用户可能还在操作其他的,那么突然加载新的页面,感觉很不友好。
浏览器的异步请求(注意再强调一遍只有浏览器才有的这个概念)有一个名称就是ajax asynchronized javascript and xml。就是脚本Javascript 同过创建 xmlhttpRequest 对象调用浏览器中的xmlhttpRequest 代理对象(现在一般所有的浏览器内核都集成了这个代理)
原理:浏览器发出的异步请求交给代理对象,浏览器就不管了,代理将数据请求发出,然后等待相应回来,再将数据包交给浏览器解析。
web 页面通过js发送http请求代码:
这是 js 获取 自己的http 对象 get请求
var http = require('http'); var qs = require('querystring'); var data = { a: 123, time: new Date().getTime()};//这是需要提交的数据 var content = qs.stringify(data); var options = { hostname: '127.0.0.1', port: 10086, path: '/pay/pay_callback?' + content, method: 'GET'
}; var req = http.request(options, function (res) { console.log('STATUS: ' + res.statusCode); console.log('HEADERS: ' + JSON.stringify(res.headers)); res.setEncoding('utf8'); res.on('data', function (chunk) { console.log('BODY: ' + chunk); });
}); req.on('error', function (e) { console.log('problem with request: ' + e.message);
}); req.end();
这是 js 获取 自己的http 对象 post请求
var http = require('http'); var qs = require('querystring'); var post_data = { a: 123, time: new Date().getTime()};//这是需要提交的数据 var content = qs.stringify(post_data); var options = { hostname: '127.0.0.1', port: 10086, path: '/pay/pay_callback', method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' }
}; var req = http.request(options, function (res) { console.log('STATUS: ' + res.statusCode); console.log('HEADERS: ' + JSON.stringify(res.headers)); res.setEncoding('utf8'); res.on('data', function (chunk) { console.log('BODY: ' + chunk); });
}); req.on('error', function (e) { console.log('problem with request: ' + e.message);
}); // write data to request body
req.write(content); req.end();
ajax请求:
function createXMLHttpRequest() { var xmlHttp; if (window.XMLHttpRequest) { xmlHttp = new XMLHttpRequest(); if (xmlHttp.overrideMimeType) xmlHttp.overrideMimeType('text/xml'); } else if (window.ActiveXObject) { try { xmlHttp = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { try { xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) { } } } return xmlHttp;
xmlHttp = createXMLHttpRequest();
var url = "getfiledetail.jsp?fileid="+id;
xmlHttp.open("GET", url, true);// 异步处理返回
xmlHttp.onreadystatechange = callback;
xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;");
xmlHttp.send()
var url = "getNginxStatus";
xmlHttp.open("POST", url, true);
xmlHttp.onreadystatechange = getStatusBack;
xmlHttp.setRequestHeader("Content-Type",
"application/x-www-form-urlencoded;");
xmlHttp.send(xml);
Java 代码的http请求:
Http请求类
package wzh.Http;import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.URL; import java.net.URLConnection; import java.util.List; import java.util.Map;public class HttpRequest {/*** 向指定URL发送GET方法的请求* * @param url* 发送请求的URL* @param param* 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。* @return URL 所代表远程资源的响应结果*/public static String sendGet(String url, String param) {String result = "";BufferedReader in = null;try {String urlNameString = url + "?" + param;URL realUrl = new URL(urlNameString);// 打开和URL之间的连接URLConnection connection = realUrl.openConnection();// 设置通用的请求属性connection.setRequestProperty("accept", "*/*");connection.setRequestProperty("connection", "Keep-Alive");connection.setRequestProperty("user-agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");// 建立实际的连接 connection.connect();// 获取所有响应头字段Map<String, List<String>> map = connection.getHeaderFields();// 遍历所有的响应头字段for (String key : map.keySet()) {System.out.println(key + "--->" + map.get(key));}// 定义 BufferedReader输入流来读取URL的响应in = new BufferedReader(new InputStreamReader(connection.getInputStream()));String line;while ((line = in.readLine()) != null) {result += line;}} catch (Exception e) {System.out.println("发送GET请求出现异常!" + e);e.printStackTrace();}// 使用finally块来关闭输入流finally {try {if (in != null) {in.close();}} catch (Exception e2) {e2.printStackTrace();}}return result;}/*** 向指定 URL 发送POST方法的请求* * @param url* 发送请求的 URL* @param param* 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。* @return 所代表远程资源的响应结果*/public static String sendPost(String url, String param) {PrintWriter out = null;BufferedReader in = null;String result = "";try {URL realUrl = new URL(url);// 打开和URL之间的连接URLConnection conn = realUrl.openConnection();// 设置通用的请求属性conn.setRequestProperty("accept", "*/*");conn.setRequestProperty("connection", "Keep-Alive");conn.setRequestProperty("user-agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");// 发送POST请求必须设置如下两行conn.setDoOutput(true);conn.setDoInput(true);// 获取URLConnection对象对应的输出流out = new PrintWriter(conn.getOutputStream());// 发送请求参数out.print(param);// flush输出流的缓冲out.flush();// 定义BufferedReader输入流来读取URL的响应in = new BufferedReader(new InputStreamReader(conn.getInputStream()));String line;while ((line = in.readLine()) != null) {result += line;}} catch (Exception e) {System.out.println("发送 POST 请求出现异常!"+e);e.printStackTrace();}//使用finally块来关闭输出流、输入流finally{try{if(out!=null){out.close();}if(in!=null){in.close();}}catch(IOException ex){ex.printStackTrace();}}return result;} }
调用方法:
public static void main(String[] args) {//发送 GET 请求String s=HttpRequest.sendGet("http://localhost:6144/Home/RequestString", "key=123&v=456");System.out.println(s);//发送 POST 请求String sr=HttpRequest.sendPost("http://localhost:6144/Home/RequestPostString", "key=123&v=456");System.out.println(sr);}
http 请求 与其同步与异步请求的通透讲解相关推荐
- OkHttpClient源码分析(一)—— 同步、异步请求分析和Dispatcher的任务调度
OkHttpClient同步请求的执行流程和源码分析 同步请求示例 OkHttpClient okHttpClient = new OkHttpClient.Builder().readTimeout ...
- ASIHTTP 框架,同步、 异步请求、 上传 、 下载
ASIHTTPRequest详解 ASIHTTPRequest 是一款极其强劲的 HTTP 访问开源项目.让简单的 API 完成复杂的功能,如:异步请求,队列请求,GZIP 压缩,缓存,断点续传,进度 ...
- AJAX怎么实现同步请求?Ajax同步和异步请求有什么区别以及使用场景有哪些?
一.AJAX怎么实现同步请求? ajax请求我们分为同步请求和异步请求,但是默认的都是异步请求,那么,当我们想用ajax同步请求时,我们该如何去实现这个同步请求呢?接下来的这篇文章就来给大家介绍一下关 ...
- 注意ajax的同步和异步请求
2019独角兽企业重金招聘Python工程师标准>>> 默认 一般ajax 或者 ajax工具 都是 异步请求的. 但是 在开发中,使用了一个 开源的 前端ui里面自带的ajax工 ...
- php和ajax的同步和异步请求,ajax 同步请求和异步请求的差异分析_javascript技巧
ajax同步和异步的差异, 先看2段代码: 代码一: Synchronize = function(url,param) { function createXhrObject() { var http ...
- XMLHttpRequest同步和异步请求
XMLHttpRequest 支持同步和异步通信.但是,一般来说,出于性能原因,异步请求应优先于同步请求. 同步请求阻止代码的执行,这会导致屏幕上出现"冻结"和无响应的用户体验. ...
- 【AJAX】请求原理 同步和异步
一..AJAX概念 本质:使用JS提供的异步对象,在页面不刷新的情况下,发送http请求,得到http响应,实现页面的局部刷新,涉及到的技术HTML JS HTTP/HTTPS 接口 XML JSON ...
- ajax同步和异步请求的区别
我们在使用 ajax 一般都会使用异步处理. 默认是async:true:异步, async:false:同步. 异步处理:我们通过事件触发 ajax,请求服务器,在这个期间无论服务器有没有响应,客户 ...
- ajax请求的同步和异步
通过设置async参数可以发起同步和异步ajax请求. 两者的主要区别在于: 异步请求在执行时,前端页面中的ajax请求与其他部分代码彼此之间是相互独立.互不影响的.如果服务器端不能响应请求,也不会影 ...
最新文章
- 分享我们用Leangoo看板工具做的采购看板,超级好用
- python三维数据转换成二维_Python科学计算全生态工具锦集
- vue 函数 路由跳转_vue路由的钩子函数和跳转
- 秒懂文件路径 / 和 ./ 和 ../ 和 ../../
- 光流(二)--光流算法
- apollo @value没生效_有Apollo,还用Archaius吗?
- java swing 飞机大战游戏 github 免费 开源 公开 源码
- 大学女生全面超男生,一个标志性事件
- Ogre 天龙八部地形管理器
- wps打印错误未定义书签怎么解决_wps目录中错误未定义书签怎么解决?
- Nat Chem Biol | 李大力/宋高洁/赵永祥合作开发“精准安全”的腺嘌呤碱基编辑器ABE9...
- mm struct与pgd
- python 泰勒展开式_python函数的Taylor级数sympy表达式
- 习题解答_反正切函数的求导
- C语言除法哪个是整除,c语言整除(c语言整除怎么表示)
- 计算机毕业设计题目大全(不断更新中)
- 微信公众平台开发入门视频教程已发布
- 恶意软件及其类型(病毒、蠕虫、木马、间谍软件、勒索软件、恐吓软件、Bots和Rootkits等)的介绍
- Expert Metalink – Support Tips Tools Resources
- 商务礼仪仪对计算机应用专业的好处,商务礼仪对大学生重要性
热门文章
- python必须使用try except而不是if else的场合
- 数据结构:线性数据结构(3)-deques(栈,队列,deques, 列表)
- h5页面不可 移动_七大h5创建工具
- oracle导入dmp文件加条件,oracle 导入DMP文件时IMP-00013: 只有 DBA 才能导入由其他 DBA 导出的文件...
- linux安装grub界面,系统安装: GRUB安装,配置及使用汇总
- 合并多个文本文件中的内容到一个文件中
- VMvare虚拟机简介、VMvare虚拟机的相关操作和管理
- 特殊权限位set_uid set_gid stick_bit 软链接硬链接
- 钱伯斯的遗产:思科与集成虚拟网络堆栈
- android--------ExpandableListView的使用多级列表