http 请求 与其同步与异步请求的通透讲解

http请求可以是基于webkit的浏览器或者web组件如:webview(在移动平台,android iOS等)发送的;也可以是任何程序或者代码段发出的;也可以这么说任何程序都可以自主发送http.


http 是超文本传输协议,其是基于tcp/ip协议。本质上首先我们是需要借助系统开启socket监听,然后使用tcp传输协议,传输数据包,将数据包凭借成http request和response,这就成了http协议。但是高级语言给我们封装了这一层。那么我们直接使用接口,无需再去自己开发(如Java,c#, javascrpt,object c)。但是正是因为这样,我们有时候,对http的理解就没有那么深入了。

http 请求 与其同步与异步请求的通透讲解_第1张图片

既然任何程序代码段都可以开发使用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 代理对象(现在一般所有的浏览器内核都集成了这个代理)

http 请求 与其同步与异步请求的通透讲解_第2张图片

原理:浏览器发出的异步请求交给代理对象,浏览器就不管了,代理将数据请求发出,然后等待相应回来,再将数据包交给浏览器解析。


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> 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);
    }
复制代码


你可能感兴趣的:(网络协议)