nodejs学习笔记(2)-内置模块(1)-http模块及其扩展模块
内置模块(1): http
模块
http
模块是Node.js
官方提供的用来创建web
服务器的模块通过
http
模块提供的http.createServer()
方法,就能方便的把一台普通的电脑,变成一台Web
服务器,从而对外提供Web
资源服务。在
Node.js
中,不需要使用IIS
、Apache
(针对php
) 等第三方web
服务器软件(普通的电脑常常安装这些),而是基于Node.js
提供的http
模块,通过几行简单的代码,就能轻松的手写一个服务器软件,从而对外提供web
服务
基本使用:(两种写法)
server.js
// nodeJS内置模块 : http模块 |
server.js
var http = require("http") |
结果展示:
终端内展示
网页展示
小案例:
- 要求: 输入对应的
url
参数,能进入对应的页面,没有该页面则返回404,状态码要与其保持一致 url
:'/home'
对应首页 ,'/list'
对应详情页
代码展示:
- server.js
// nodeJS内置模块 : http模块 |
结果展示:
http
模块扩展-jsonp
什么是jsonp
?
- 我们在发送
Ajax
请求的时候会受同源策略
的影响而存在跨域请求
的问题,不管是静态页面、动态页面、web
服务,只要是跨域请求,一律都是不允许的 - 但是
web
页面调用js
文件则不受跨域的影响(不仅如此,我们还发现凡是拥有“src
”这个属性的标签都拥有跨域的能力,比如<\script>
、<\img>
、<\iframe>
)。 - 于是可以判断,当前阶段如果想通过纯web端跨域访问数据就只有一种可能,那就是在远程服务器上设法把数据装进js格式的文件里,供客户端调用和进一步处理。
- 恰巧我们知道有一种叫做
JSON
的纯字符数据格式可以简洁的描述复杂数据,更妙的是JSON
还被js
原生支持,所以在客户端几乎可以随心所欲的处理这种格式的数据。 - 这样,解决方案就呼之欲出了,
web
服务端通过与调用脚本一模一样的方式,来调用跨域服务器上动态生成的js
格式文件,显而易见,服务器之所以要动态生成JSON
文件,目的就在于把客户端需要的数据装进去。久而久之就形成了一种非正式的传输协议:JSONP(JSON with Padding)
代码展示:(这里结合url
和http
模块的使用)
- 服务端(
json.js
)
// 内置模块: http模块 - jsonp解决跨域 |
- 前端页面(
jsonp.html
)
|
结果展示:
服务端展示
前端页面展示
http
模块扩展-cors
CORS
:全称”跨域资源共享”(Cross-origin resource sharing
)。- 我们可以设置三个响应头来实现跨域请求
- 使用
res.writeHeader(“Access-Control-Allow-Origin”,"*")
- 表示允许任何域的请求,如果想要特定的话
*
换成特定url
- 表示允许任何域的请求,如果想要特定的话
- Access-Control-Allow-Headers
- 因为
cors
仅支持客户端向服务端发送9个请求头,如果超过了就用res.setHeader(“Access-Control-Allow-Headers”
,”添加需要的请求头”)
- 因为
- Access-Control-Allow-Methods
- 默认情况下只支持客户端发起
GET POST HEAD
,如果要用其他的比如PUT DELETE
就需要使用res.setHeader``(“Access-Control-Allow-Methods”,"*")
添加*
就是指添加所有的方法。
- 默认情况下只支持客户端发起
- 使用
代码展示:
- 服务端(
cors.js
)
// 内置模块: http模块 - cors解决跨域 |
- 前端页面(
cros.html
)
|
结果展示:
服务端
前端页面
http
模块扩展-get
- 要知道
node
不仅可以作为服务端(后端返回数据),更能作为客户端(向另一个后端请求数据)。众所周知,前端页面向服务端发送请求是受同源策略
影响的,即存在跨域问题
,但是服务器与服务器之前是不受同源策略
影响的,即服务器之间相互请求数据是没有跨域问题
的,因此当我们向一个没有设置允许跨域请求("access-control-allow-origin")
后端服务器请求数据时,是没有办法请求到数据的,但是我们可以通过node
作为一个中间件客户端
来时用,即前端向node
请求数据,node
向目标服务器请求数据后再返回给前端,这就能实现即便目标服务器没有设置允许跨域,我们同样能请求到数据。这就是node
的一个非常的强大之处。
代码展示:
- 服务端(
get.js
)
// 内置模块: http模块 - get模块 |
- 前端页面(
get.html
)
|
结果展示:
服务端成功输出获取到的数据
前端网页数据也获取成功
http
模块扩展-post
- 与
get
很相似,不过与之不一样的是请求参数的携带的地方,get
请求是写在url
中的,而post
请求是写在请求体中的,通过req.write()
来写入
代码展示:
- 服务端(
post.js
)
// 内置模块: http模块 - post模块 |
- 前端页面(
post.html
)
|
结果展示:
服务端成功输出获取到的数据
前端网页数据也获取成功
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0许可协议。转载请注明来自 肥林の仓库