全栈●简单课程程序员今日看点

nodejs 使用的一些http网络请求模块

2016-11-07  本文已影响7546人  艾伦先生

http

大部分的node使用者,都是用node来做Web API的,而HTTP模块是提供Web API的基础。为了支持所有的HTTP应用,node中的HTTTP模块提供的API是偏向底层化的。利用HTTP模块,我们可以简单快速搭建一个Web Server。

node提供了http这个核心模块(不用安装哦,直接require就可以了),用于创建http server服务,使用下面代码,轻松在本机的3000端口创建一个http服务器

// http_demo.js
var http=require("http");

http.createServer(function(req,res){
    res.writeHead(200,{
        "content-type":"text/plain"
    });
    res.write("hello world");
    res.end();
}).listen(3000);

$~ node http_demo.js

下面我们逐步展开HTTP 的 API

httpService (http服务器)

开篇的实例代码,也可以通过如下的代码进行改写一番:

var http=require("http");
var server=new http.Server();

server.on("request",function(req,res){
    res.writeHead(200,{
        "content-type":"text/plain"
    });
    res.write("hello nodejs");
    res.end();
});
server.listen(3000);

以上代码是通过直接创建一个http.Server对象,然后为其添加request事件监听,其实也就说createServer方法其实本质上也是为http.Server对象添加了一个request事件监听,这似乎更好理解了,那让我们看看http的重要属性

createServer方法中的参数函数中的两个参数req和res则是分别代表了请求对象和响应对象。其中req是http.IncomingMessage的实例,res是http.ServerResponse的实例。

http client

http模块提供了两个函数 http.requesthttp.get,功能是作为客户端向http服务器发起请求。

request

可以将requset模块想象成一个简化版的第三方类http模块,同时支持https 和重定向,戳这里区官网。下文列出几个能够让你快速上手的知识点。

安装

npm install request --save
var request = require('request');

API

任何响应都可以输出到文件流。

request('http://google.com/doodle.png').pipe(fs.createWriteStream('doodle.png'))

反过来,也可以将文件传给PUT或POST请求。未提供header的情况下,会检测文件后缀名,在PUT请求中设置相应的content-type。

fs.createReadStream('file.json').pipe(request.put('http://mysite.com/obj.json'))

表单

request支持 application/x-www-form-urlencodedmultipart/form-data 实现表单上传。

superagent

superagent它是一个强大并且可读性很好的轻量级ajax API,是适用于nodejs环境的一个关于HTTP方面的库。

安装

npm install superagent --save

简单使用

一个请求的初始化可以用请求对象里合适的方法来执行,然后调用end()来发送请求。

var superagent = require('superagent');

superagent
    .post('/api')
    .send({
        'key': 'value'
    })
    .set('header_key', 'header_value')
    .end(function(err, res) {
        if (err) {
            //do something
        } else {
            //do something
        }
    })

或
superagetn
    .get(''http://example.com/search'')
    .end(function(res){ });

API

请求方法的参数可以直接使用多个key/value,也可以分多次调用请求方法每次传递一对key/valu或者key/value字符串

post && get

当用.send(obj)方法来发送一个post请求,并且希望传递一些查询字符串,可以调用.query()方法,比如向?format=json&dest=/login发送post请求:

request 
  .post('/') 
  .query({ format: 'json' })
  .query({ dest: '/login' }) 
  .send({ post: 'data', msg: 'hello' }) 
  .end(callback);

请求设置

响应一般会提供很多有用的标识以及属性,都在response对象里,按照respone.text,解析后的response.body,头字段,一些标识的顺序来排列。

- res.text
    包含未被解析的响应数据

- res.body
    包含解析的数据,跟请求数据自动序列化一样,响应数据也会自动的解析,
    当为一个Content-Type。定义一个解析器后,就能自动解析,默认解析包
    含application/json和application/x-www-form-urlencoded,可以
    通过访问res.body来访问解析对象。

- res.header
    响应头,res.header包含解析之后的响应头数据,键值都是node处理成小
    写字母形式,比如res.header['content-length'].

- res.type & res.charset 类型和编码格式
    Content-Type响应头字段是一个特列,服务器提供res.type来访问它,
    默认res.charset是空的,如果有的话,则自动填充,例如Content-Type
    值为text/html; charset=utf8,则res.type为text/html,res.charst
    为utf8.

- res.status状态码

其他设置

上一篇 下一篇

猜你喜欢

热点阅读