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();
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();
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);
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); }