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 请求 与其同步与异步请求的通透讲解相关推荐

  1. OkHttpClient源码分析(一)—— 同步、异步请求分析和Dispatcher的任务调度

    OkHttpClient同步请求的执行流程和源码分析 同步请求示例 OkHttpClient okHttpClient = new OkHttpClient.Builder().readTimeout ...

  2. ASIHTTP 框架,同步、 异步请求、 上传 、 下载

    ASIHTTPRequest详解 ASIHTTPRequest 是一款极其强劲的 HTTP 访问开源项目.让简单的 API 完成复杂的功能,如:异步请求,队列请求,GZIP 压缩,缓存,断点续传,进度 ...

  3. AJAX怎么实现同步请求?Ajax同步和异步请求有什么区别以及使用场景有哪些?

    一.AJAX怎么实现同步请求? ajax请求我们分为同步请求和异步请求,但是默认的都是异步请求,那么,当我们想用ajax同步请求时,我们该如何去实现这个同步请求呢?接下来的这篇文章就来给大家介绍一下关 ...

  4. 注意ajax的同步和异步请求

    2019独角兽企业重金招聘Python工程师标准>>> 默认 一般ajax 或者 ajax工具  都是 异步请求的. 但是 在开发中,使用了一个 开源的 前端ui里面自带的ajax工 ...

  5. php和ajax的同步和异步请求,ajax 同步请求和异步请求的差异分析_javascript技巧

    ajax同步和异步的差异, 先看2段代码: 代码一: Synchronize = function(url,param) { function createXhrObject() { var http ...

  6. XMLHttpRequest同步和异步请求

    XMLHttpRequest 支持同步和异步通信.但是,一般来说,出于性能原因,异步请求应优先于同步请求. 同步请求阻止代码的执行,这会导致屏幕上出现"冻结"和无响应的用户体验. ...

  7. 【AJAX】请求原理 同步和异步

    一..AJAX概念 本质:使用JS提供的异步对象,在页面不刷新的情况下,发送http请求,得到http响应,实现页面的局部刷新,涉及到的技术HTML JS HTTP/HTTPS 接口 XML JSON ...

  8. ajax同步和异步请求的区别

    我们在使用 ajax 一般都会使用异步处理. 默认是async:true:异步, async:false:同步. 异步处理:我们通过事件触发 ajax,请求服务器,在这个期间无论服务器有没有响应,客户 ...

  9. ajax请求的同步和异步

    通过设置async参数可以发起同步和异步ajax请求. 两者的主要区别在于: 异步请求在执行时,前端页面中的ajax请求与其他部分代码彼此之间是相互独立.互不影响的.如果服务器端不能响应请求,也不会影 ...

最新文章

  1. 分享我们用Leangoo看板工具做的采购看板,超级好用
  2. python三维数据转换成二维_Python科学计算全生态工具锦集
  3. vue 函数 路由跳转_vue路由的钩子函数和跳转
  4. 秒懂文件路径 / 和 ./ 和 ../ 和 ../../
  5. 光流(二)--光流算法
  6. apollo @value没生效_有Apollo,还用Archaius吗?
  7. java swing 飞机大战游戏 github 免费 开源 公开 源码
  8. 大学女生全面超男生,一个标志性事件
  9. Ogre 天龙八部地形管理器
  10. wps打印错误未定义书签怎么解决_wps目录中错误未定义书签怎么解决?
  11. Nat Chem Biol | 李大力/宋高洁/赵永祥合作开发“精准安全”的腺嘌呤碱基编辑器ABE9...
  12. mm struct与pgd
  13. python 泰勒展开式_python函数的Taylor级数sympy表达式
  14. 习题解答_反正切函数的求导
  15. C语言除法哪个是整除,c语言整除(c语言整除怎么表示)
  16. 计算机毕业设计题目大全(不断更新中)
  17. 微信公众平台开发入门视频教程已发布
  18. 恶意软件及其类型(病毒、蠕虫、木马、间谍软件、勒索软件、恐吓软件、Bots和Rootkits等)的介绍
  19. Expert Metalink – Support Tips Tools Resources
  20. 商务礼仪仪对计算机应用专业的好处,商务礼仪对大学生重要性

热门文章

  1. python必须使用try except而不是if else的场合
  2. 数据结构:线性数据结构(3)-deques(栈,队列,deques, 列表)
  3. h5页面不可 移动_七大h5创建工具
  4. oracle导入dmp文件加条件,oracle 导入DMP文件时IMP-00013: 只有 DBA 才能导入由其他 DBA 导出的文件...
  5. linux安装grub界面,系统安装: GRUB安装,配置及使用汇总
  6. 合并多个文本文件中的内容到一个文件中
  7. VMvare虚拟机简介、VMvare虚拟机的相关操作和管理
  8. 特殊权限位set_uid set_gid   stick_bit 软链接硬链接
  9. 钱伯斯的遗产:思科与集成虚拟网络堆栈
  10. android--------ExpandableListView的使用多级列表