http.request(options, callback) 发起 HTTP 请求。接受两个参数,option 是 一个类似关联数组的对象,表示请求的参数,callback 是请求的回调函数。
option 常用的参数如下所示。
host :请求网站的域名或 IP 地址。
port :请求网站的端口,默认 80。
method :请求方法,默认是 GET。
path :请求的相对于根的路径,默认是“/”。QueryString 应该包含在其中。 例如 /search?query=byvoid。
headers :一个关联数组对象,为请求头的内容。
callback 传递一个参数,为 http.ClientResponse 的实例。 http.request 返回一个 http.ClientRequest 的实例。
服务端的代码为:
var http = require("http");//获取http对象
var url = require("url");//获取url对象
var querystring = require("querystring");//获取querystring对象
http.createServer(
//匿名的回调函数,当有请求进来的时候调用该函数
//req参数相当于J2EE的HttpServletRequest,
//res参数相当于J2EE的HttpServletResponse
function(req,res){
res.writeHead(200,{"Content-Type":"text/html"});
//获取请求地址
var requresturl = req.url;
res.write("request url:" + requresturl + "<br/>");
//请求的路径
var pathname = url.parse(req.url).pathname;
res.write("pathname:" + pathname + "<br/>");
//请求的参数
var querystr = url.parse(req.url).query;
res.write("query str : " + querystr + "<br/>");
//请求的地址进行所有属性的解析
var obj = url.parse(req.url);
res.write(JSON.stringify(obj)+"<br/>");
res.write("<hr/>");
//请求的参数转为JSON格式
var params = querystring.parse(querystr);
res.write(JSON.stringify(params)+"<br/>");
res.write("<hr/>");
res.end("please input a url like : http://172.24.12.38:3000/aa/b/c/a.do?a=1&b=4");
}
).listen(3000); //监听3000端口
console.log(" HTTP Server is Listening at port 3000.");
客户端发送请求的代码为:
var http = require("http");//获取http对象
var querystring = require("querystring");//获取querystring对象
var contents = querystring.stringify({
name:'devil13th',
email:'devil13th@163.com',
addr : ' China BeJing Xizhimen Xinjiekou'
})
/*
http.request(options, callback) 发起 HTTP 请求。接受两个参数,option 是
一个类似关联数组的对象,表示请求的参数,callback 是请求的回调函数
--- option
常用的参数如下所示。
host :请求网站的域名或 IP 地址。
port :请求网站的端口,默认 80。
method :请求方法,默认是 GET。
path :请求的相对于根的路径,默认是“/”。QueryString 应该包含在其中。
例如 /search?query=byvoid。
headers :一个关联数组对象,为请求头的内容。
----callback 传递一个参数,为 http.ClientResponse 的实例。
http.request 返回一个 http.ClientRequest 的实例。
*/
var options = {
host:'172.26.192.180',
path:'/aa/b/c/a.do?a=1&b=4',
method:'get',
port:3000,
headers:{
'Content-Type':'application/x-www-form-urlencoded',
'Content-Length':contents.length
}
}
//创建http.ClientRequest对象 ,
/*表示一个已经产生而且正在进行中的 HTTP 请求。
它提供一个 response 事件,
即 http.request或 http.get 第二个参数指定的回调函数的绑定对象。
*/
var req = http.request(options,function(res){
res.setEncoding('utf-8');
res.on('data',function(data){
console.log(data);
});
});
req.write(contents);
req.end();//不要忘了通过 req.end() 结束请求,否则服务器将不会收到信息。
打开两个bash,先运行服务器代码,在运行客户端代码我们可以看到 http.ClientRequest对象
http.ClientRequest 是由 http.request 或 http.get 返回产生的对象,表示一 个已经产生而且正在进行中的 HTTP 请求。它提供一个 response 事件,即 http.request 或 http.get 第二个参数指定的回调函数的绑定对象。
http.ClientRequest 像 http.ServerResponse 一样也提供了 write 和 end 函 数,用于向服务器发送请求体,通常用于 POST、PUT 等操作。所有写结束以后必须调用 end 函数以通知服务器,否则请求无效。http.ClientRequest 还提供了以下函数。
request.abort():终止正在发送的请求。
request.setTimeout(timeout, [callback]):设置请求超时时间,timeout 为 毫秒数。当请求超时以后,callback 将会被调用。
此外还有request.setNoDelay([noDelay])、request.setSocketKeepAlive ([enable], [initialDelay]) 等函数,参见api
http.ClientResponse
http.ClientResponse 与 http.ServerRequest 相似,提供了三个事件 data、end 和 close,分别在数据到达、传输结束和连接结束时触发,其中 data 事件传递一个参数 chunk,表示接收到的数据。
http.ClientResponse 也提供了一些属性,用于表示请求的结果状态
statusCode HTTP 状态码,如 200、404、500
httpVersion HTTP 协议版本,通常是 1.0 或 1.1
headers HTTP 请求头
trailers HTTP 请求尾(不常见)
http.ClientResponse 还提供了以下几个特殊的函数。
response.setEncoding([encoding]):设置默认的编码,当 data 事件被触发 时,数据将会以 encoding 编码。默认值是 null,即不编码,以 Buffer 的形式存 储。常用编码为 utf8。
response.pause():暂停接收数据和发送事件,方便实现下载功能。
response.resume():从暂停的状态中恢复。