Node.js处理HTTP

http://nodejs.cn/api/http.html

  • HTTP 服务器和客户端,必须引入: require('http');

1、require 引入

  • 如果有路径就在路径中查找(自定义的模块)
  • 如果没有路径,就在node_modules中查找(npm安装的模块)
  • 在没有路径,且没有node_modules的时候,会在node的安装目录中查找(一般用于系统模块)

2、服务器对象:

http.createServer() 快速搭建服务器(本机iP地址:127.0.0.1 域名:localhost)

let http = require("http");

http.createServer(()=>function{
    console.log("内容")
}).listen(8081)
// .listen(8081)是监听要访问的端口。
// 参数是一个回调函数。启动之后,在浏览器访问这个端口,就可以执行回调函数
  • 回调函数有两个参数,是返回给服务器的。
  • 第一个参数:request 请求的时候传递的参数(简写req)
  • 第二个参数:response 服务器返还的参数(简写res)
let http = require("http");

http.createServer((req,res)=>function{
    res.write("index"); // 返还的内容
    res.end(); // 表示结束。

    // 可简写:
    // res.end("index")
}).listen(8081)

3、路由

  • 作用
    (1)定义method(请求方式。比如:get/post)
    (2)定义url规则(url的形式,比如:/api/list)
    (3)定义输入(request body)和输出(response body)

  • get :
    (1)一般用于从服务器上获取数据
    (2)测试可用浏览器直接访问

  • post :
    (1)一般用于向服务器传送数据
    (2)测试需要借助工具—— postman

  • url:判断获取的url中是否有参数,可截取,例:

const http = require('http');

const server = http.createServer((req, res) => {
    const url = req.url
    // 截取url链接中,问号前面的部分,并赋值给path
    const path = url.split('?')[0] //后面判断路由的时候,直接使用path判断
    const method = req.method

    console.log('url:' + url)
    console.log('method:' + method)
    // 定义路由,模拟获取留言板
    if (path === '/api/list' && method === 'GET') {
        res.end('成功获取')
    }

    // res.end("ceshi")
    res.end("404")

}).listen(3000)

4、postman

  • 下载地址:https://www.postman.com/
  • 作用:这里用于测试使用psot发送请求
  • 安装:
    win7 安装的时候,提示缺少Microsoft.NET, 直接点击安装即可。


    安装
const http = require('http');

const server = http.createServer((req, res) => {
    const url = req.url

    const path = url.split('?')[0] //后面判断路由的时候,直接使用path判断
    const method = req.method

    console.log('url:' + url)
    console.log('method:' + method)
    // 定义路由,模拟获取留言板
    if (path === '/api/list' && method === 'GET') {
        res.end('成功获取')
    }
    // 添加post方式,匹配的路由判断 ,模拟创建留言
    if (path === '/api/create' && method === 'POST') { 
        res.end('POST成功')
    }

    // res.end("ceshi")
    res.end("404")

}).listen(3000)
POST测试

5、querystring

  • 形式:
    (1)在url中,问号(?)后面的都是querystring,就得说url的参数部分。例:

    querystring

    (2)若是有多个参数,每个参数直接使用"&"分隔,参数是key=value的形式

  • 作用以及如何使用:
    (1)输入不同的参数,可访问不同的页面,不同的部分。
    (2)服务端拿到querystring,根据不同的querystring返回不同的内容。querystring改变的时候,对应的内容发生变化
    (3)注意: url中的问号,使用英文格式的,不然获取的url中有EF%BC%等,例:

    问号格式错误

    (4)测试:
    image.png

  • querystring.parse
    (1) 引入 querystring模块:const querystring = require('querystring');
    (2) 使用querystring.parse 能够将获取的a = 100,转换为{a:100}的格式,例:
    parse

(3)url的hash,如下,"#"号后面的部分,不能使用parse获取,因为hash无法传递到服务端。


hash
  • 结构化与非结构化 (简单了解即可)
    (1)结构化的数据,易通过程序访问和分析,比如:对象、数组。
    (2)非结构话的,不易通过程序分析,比如:字符串
    (3)所以一般建议,尽量使用结构化数据

6、使用response返回数据

  • 返回json格式数据

(1)设置appLication/json
res.writeHead(200, { 'Content-type': 'appLication/json' })
(2)get请求,返回json

GET

(3)post请求,返回json
POST

(4)返回字符串
res.writeHead(404, { 'Content-type': 'text/plain' })
(5)整体代码参考如下:

const http = require('http')
const querystring = require('querystring')

const server = http.createServer((req, res) => {
    const url = req.url
    const path = url.split('?')[0]
    const queryStr = url.split('?')[1]
    const method = req.method
    const query = querystring.parse(queryStr)


    if (path === '/api/list' && method === 'GET') {

        const result = {
            errno: 0,
            data: [
                { user: '张三', content: "留言1" },
                { user: '张四', content: "留言2" }
            ]
        }
        // res.end('成功获取')
        res.writeHead(200, { 'Content-type': 'appLication/json' })
        res.end(JSON.stringify(result))
    }

    if (path === '/api/create' && method === 'POST') {
        // res.end('POST成功')
        const result = {
            errno: 0,
            message: '创建成功'

        }
        res.writeHead(200, { 'Content-type': 'appLication/json' })
        res.end(JSON.stringify(result))
    }
    // 页面返回字符串
    res.writeHead(404, { 'Content-type': 'text/plain' })
    res.end("404")

}).listen(3000)
  • 返回html格式数据(了解即可,不使用)
    (1)设置Content-type:text/html
    (2)如下:
    返回html格式

7、使用request返回数据

  • 流:
  • 下载时:
    (1)source(服务端),dest(前端/客服端)
    水相当于下载的数据,水管,相当于网络


    image.png

    (2)服务端 res.end(...),自动以流的形式返回给浏览器,浏览器识别到流,会持续接收信息。接收完之后,会显示或处理。(比如:视频一段段的加载显示)

  • 上传时:
    (1)source前端,dest服务端
    水相当于上传的数据,水管,相当于网络
  • 识别“流”,并输出数据:
const http = require('http')
const querystring = require('querystring')

const server = http.createServer((req, res) => {

    const url = req.url
    const path = url.split('?')[0]
    const method = req.method
    // const queryStr = url.split('?')[1]

    // const query = querystring.parse(queryStr)
    console.log('path:' + path)
    console.log('method:' + method)
    if (path === '/api/abc' && method === 'POST') {
        // POST请求。传递json数据
        // const result = {
        //     errno: 0,
        //     message: '创建成功'

        // }
        // res.writeHead(200, { "Content-type": 'appLication/json' })
        // res.end(JSON.stringify(result))


        // 服务端,如何去识别并接收"流"
        let bodyStr = ''
        req.on('data', chunk => {
            // chunk :"流"的每一段数据

            bodyStr += chunk.toString() // 每次流一段,将其累加,
        })

        // 服务端,如何知道"流"流完了,完了之后,会执行end方法。
        req.on('end', () => {
            console.log('bodyStr:', bodyStr)
            res.end('接收完')
        })
        // const result = {
        //     errno: 0,
        //     message: '创建成功'

        // }
        // res.writeHead(200, { 'Content-type': 'appLication/json' })
        // res.end(JSON.stringify(result))
    }
    // res.end('POST成功33')

}).listen(3000)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,701评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,649评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,037评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,994评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,018评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,796评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,481评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,370评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,868评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,014评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,153评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,832评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,494评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,039评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,156评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,437评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,131评论 2 356