Http服务器响应客户端,创建HTTP与HTTPS服务器及客户端

HTTP 服务器

创建 HTTP 服务器1

2

3

var server = http.createServer([requestListener]);

requestListener ==> function(request, response){...}

回调函数中有两个参数,第一个参数代表客户端请求,第二个参数代表一个服务器响应对象。若不在 createServer 方法中使用参数,也可以通过监听服务器对象的 request 事件server.on('request', function(request,response){...})。

在创建了 http 服务器之后,需要指定服务器监听的地址server.listen(port, [host], [bocklog], [callback])可使用 listen 回调函数指定 listening 事件的回调函数,也可以使用 server 对象监听 listening 事件

关闭 http 服务器server.close(),当服务器关闭时,触发 close 事件server.on('close',function(){...})

若 http 服务器监听的端口或地址已被占用,将产生错误代码为” EADDRINUSE” 的错误,同时将触发 HTTP 服务器的 error 事件

客户端和服务端建立连接时,触发 connect 事件server.on('connection',function(socket){...})。在浏览器访问 HTTP 服务器时,浏览器会发出两次客户端请求,一次是用户发出的请求,另一次是浏览器为页面在收藏加中的显示图标(favicon.ico)自动发出的。

设置超时server.setTimeout(msecs, callback)超时触发 timeout 事件。

获取客户端请求信息

HTTP 服务器接收到客户端请求时调用回调函数中的第一个参数值为 http.IncomingMessage 对象,该对象用于读取客户端请求流中的数据。当读取代新数据触发 data 事件,读取完毕触发 end 事件。

req 下的 data 事件和 end 事件。

转换 URL 字符串与查询字符串

在 node.js 中,提供了一个 url 模块和一个 Query String 模块,分别用来转换完整 URL 字符串和 URL 中的查询字符串。

在一个完整的 URL 字符串中,从?字符之后到 # 号字符之前或者到 URL 字符串结束的这一部分为查询字符串

可以使用 Query String 模块中的parse方法将查询字符串转化为一个对象,querystring.parse(str,[sep],[eq],[options])sep 用于指定查询字符串的分割字符,默认为 “&”;eq 用于指定查询字符串中的分配字符,默认为 “=”;options 为一个对象,对象中设置maxKeys来指定转换后的对象属性个数。

querystring.stringify(obj,[sep],[eq])将对象转换为一个查询字符串,sep 指定查询字符串中的分隔符,默认为&;eq 指定查询字符串中使用的分配字符,默认为=。

URL 模块专门用于对完整的 URL 字符串进行转换。

parse 方法将一个 URL 字符串转化为一个对象。url.parse(urlStr, [parseQueryString])

format 方法将 URL 字符串经过转换后的对象还原成一个URL 字符串。url.format(urlobj)

resolve 方法将两个路径结合成为一个路径 url.resolve(from, to)

如果 from 为网络路径,to 为非网络路径的绝对路径,则返回网络根目录 + 参考路径

其他情况下,to 为绝对路径,则返回参考路径

如果 from 为一个不以 “/” 字符结尾的根目录且 to 为相对路径,则返回根目录 +/+ 参考路径去除开头./或../

如果 from 为一个以 “/” 字符结尾的根目录且 to 为相对路径,则返回根目录 +/+ 参考路径去除开头./或../

url.resolve('http://www.example.com/a/b/c', 'one')返回

url.resolve('http://www.example.com/a/b/c/', 'one')返回

url.resolve('http://www.example.com/a/b/c', './one')返回

url.resolve('http://www.example.com/a/b/c/', './one')返回

url.resolve('http://www.example.com/a/b/c', '../one')返回

url.resolve('http://www.example.com/a/b/c', '../one')返回

发送服务器端相应流

在 createServer 方法的参数值回调函数或服务器对象的 request 事件函数中的第二个参数值为一个 http.ServerResponse 对象,可以利用该对象发送服务器端响应流。

response.writeHead(statusCode,[reasonPhrase],[headers])statusCode 指定一个 HTTP 状态码,例如 404。reasonPhrase 指定对于状态码的描述信息。第三个参数为一个对象,指定服务器端创建的响应头对象。在响应头中包含的常用字段如下:

content-type: 指定内容类型

location: 将客户端重定向到另一个 URL 地址

content-disposition: 指定一个被下载的文件名

content-length: 指定服务器端响应内容的字节数

set-cookie: 在客户端创建一个 cookie

content-encoding: 指定服务器端响应内容的编码方式

Cache-Control: 开启缓存机制

Expires: 用于指定缓存过期时间

Etag: 用于指定当前服务器响应的内容没有变化时不重新下载数据

若服务器端口为 1337,并从 80 端口的网站运行 HTML5 页面,这是一种跨域操作。需要在 HTTP 响应头中添加 Access-Control-Allow-Origin 字段,并且将参数值指定为允许向服务器请求数据的端口 + 端口号(省略端口号时允许该域名下的任何端口向服务器请求数据)

1

2

res.writeHead(200, {'Content-Type': 'text/plain',

'Access-Control-Allow-Origin': 'http://localhost'})

response.setHeader(name, value)单个设置头信息

response.getHeader(name)获取响应字段

response.removeHeader(name)删除响应字段,必须在 ServerResponse 对象的 write 方法之前被调用

在调用 writeHead 方法时即发送响应头。在使用 setHeader 时,调用 write 方法即发送响应头。两种方法发送响应头的时间不一样。

默认情况下,HTTP 服务器自动将服务器端的当前时间作为响应头的 Date 字段发给客户端,可以设置sendDate为 false 删除 Date 字段。statusCode 获取 HTTP 服务器返回的状态码。

res.addTrailers(headers)在响应数据的尾部追加一个头信息,headers 为一个对象

res.write(chunk, [encoding])发送响应内容。

HTTP 客户端

var req = http.request(options, callback)向其他网站发送请求数据。

req.on('resposne',function(res){})当客户端请求获取到响应流之后,触发 response 事件

req.write(chunk,[encoding]) 向目标网站发送数据

req.end([chunk],[callback])结束本次请求

在建立连接的过程中,当为该连接分配端口时,触发 http.ClientRequest 对象的 socket 事件req.on('socket',funcition(socket){...})

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值