http模块是nodejs中非常重要的一部分,用于开启一个服务,我们可以用它自定义接口供客户端使用。
 
开启服务的方式也比较简单,几行代码就可以搞定
const http = require('http')

const server = http.createServer((req, res)=>{
res.end('hello world')
}) server.listen('8000', ()=> {console.log('8000端口已启动~')}) // 在命令行工具中输入 node [当前的文件名] 即可启动,启动成功后在命令行工具输出:8000端口已启动~
 
 
通过 createServer 创建服务时,传入的回调函数里的两个参数分别是request和result即请求和响应,request里有很多和请求相关的参数。
常用的属性是url、method和headers即请求的链接,方法和头部信息,头部信息里又包括了主机名、可接受压缩的形式、请求类型、请求长度等等。
http模块需要根据这些信息进行不同的请求处理,从而给客户端返回相对应的结果。用postman模拟发送post请求,打印的request的三个参数如下图所示。
 
 
get请求的参数可以通过url直接获取,并对数据进行处理,而post请求的参数是放在body中的,不能直接通过header获取,需要通过 req.on来监听参数的内容,获取到的数据类型默认是 Buffer,可以通过req.setEncoding设置为需要的数据类型,utf-8、binary等,或者通过Buffer数据toString()方法可以转换成 utf-8的编码形式

const server = http.createServer((req, res)=>{
console.log('req.url:', req.url) req.on('data', data=>{
console.log('post请求的data: ',data.toString())
})
res.end('hello world')
})
 
http的请求和响应是以数据流的形式传递的,响应可以通过 end方法来写入响应内容并关闭流,默认是相应格式为text类型,如果需要传递其他类型的响应结果,需要通过setHeader或者writeHead来定义Content-Type,Content-Type默认是 text/plain,即文本,更改为 text/html 即下图展示的html渲染方式
const server = http.createServer((req, res)=>{
res.setHeader("Content-Type", "text/html")
res.end('<h1>hello node</h1>')
})

http模块可以开启一个服务,用来处理客户端发送过来的http请求,同时,它也可以发送http请求,get请求和post请求接收响应的相同点在于都需要通过on来监听data,从回调函数中获取响应结果,不同点在于post请求还需要监听请求结束的end方法,当end方法执行时,再关闭此次post请求。
 
const http = require('http')

// get请求监听data方法
http.get('http://localhost:8000', (res)=>{
res.on('data', data=>{
console.log('get请求的响应:', data.toString())
})
}) // post请求还需监听end方法,以及关闭请求
const req = http.request({
method: 'post',
port: 8000,
hostname: 'localhost'
}, res=>{
res.on('data', data=>{
console.log('post请求的响应:',data)
}) res.on('end', ()=>{
console.log('post请求获取到了所有请求结果')
})
}) req.end()

 
http模块的复杂点在于处理请求参数,get请求的参数通过字符串解析url就可以,post请求需要根据上传类型来进行区分,上传的是json数据、urlencoded还是文件,解析的方式都不相同,所以通常会使用框架来简化我们的编码流程, express和koa都极大的简化了逻辑的处理过程。
 
 

nodejs中如何使用http创建一个服务的更多相关文章

  1. nodejs中使用worker_threads来创建新的线程

    目录 简介 worker_threads isMainThread MessageChannel parentPort和MessagePort markAsUntransferable SHARE_E ...

  2. 创建一个欢迎 cookie 利用用户在提示框中输入的数据创建一个 JavaScript Cookie,当该用户再次访问该页面时,根据 cookie 中的信息发出欢迎信息。

    创建一个欢迎 cookie 利用用户在提示框中输入的数据创建一个 JavaScript Cookie,当该用户再次访问该页面时,根据 cookie 中的信息发出欢迎信息. <html> & ...

  3. springboot创建一个服务,向eureka中注册,使用swagger2进行服务管理

    首先pom.xml文件,spring boot.springcloud版本很麻烦,容易出问题 <?xml version="1.0" encoding="UTF-8 ...

  4. 写入数据到Plist文件中时,第一次要创建一个空的数组,否则写入文件失败

    #pragma mark - 保存数据到本地Plist文件中 - (void)saveValidateCountWithDate:(NSString *)date count:(NSString *) ...

  5. SpringCloud学习6-如何创建一个服务消费者consumer

    上一节如何创建一个服务提供者provider已经启动了一个provider的server,提供用户信息查询接口.接下来,我们启动另一个provider,由于是同一台机器本地测试,我们换一个端口 --s ...

  6. 为Web页中的Table对象创建一个映射表

    HTML对象中的TABLE是我们常用的网页元素,在DHTML编程中,我们可以通过它的rows和cells方法方便的访问表格对象里面的每一个单元格,而且表格对象(table)的每个单元行(tr)和每个单 ...

  7. 【Blazor】在ASP.NET Core中使用Blazor组件 - 创建一个音乐播放器

    前言 Blazor正式版的发布已经有一段时间了,.NET社区的各路高手也创建了一个又一个的Blazor组件库,其中就包括了我和其他小伙伴一起参与的AntDesign组件库,于上周终于发布了第一个版本0 ...

  8. Angular2快速入门-4.创建一个服务(创建NewsService提供数据)

    上篇我们使用的数据是通过mock-news.ts中的const News[] 数组直接赋给Component 组件的,这篇我们把提供数据的部分单独封装成服务 第一.创建news.service.ts ...

  9. 在eclipse中,用maven创建一个web项目工程

    1.在eclipse中用maven创建项目,右键new>>Maven Project 2.点击next继续 3.点击next继续,选择maven-archetype-webapp, 4.点 ...

  10. [转]在eclipse中,用maven创建一个web项目工程

    1.在eclipse中用maven创建项目,右键new>>Maven Project 2.点击next继续 3.点击next继续,选择maven-archetype-webapp, 4.点 ...

随机推荐

  1. 【已解决】使用代理后,登陆微软账号提示0x800190001

    今天晚上想要登录Onedrive同步文件时,发现怎么都登陆不上去,报出的错误代码是0x80190001,在网上搜索了各种方法,重置网络,重置Onedrive都没什么用,甚至把Onedrive重装了一遍 ...

  2. 2022-09-07:给你一个由正整数组成的数组 nums 。 数字序列的 最大公约数 定义为序列中所有整数的共有约数中的最大整数。 例如,序列 [4,6,16] 的最大公约数是 2 。 数组的一个

    2022-09-07:给你一个由正整数组成的数组 nums . 数字序列的 最大公约数 定义为序列中所有整数的共有约数中的最大整数. 例如,序列 [4,6,16] 的最大公约数是 2 . 数组的一个 ...

  3. AHB2APB bridge IP简介

    背景介绍 AMBA总线规范是由ARM公司提出的一种开放性的片上总线标准,它独立于处理器和工艺技术,具有高速度.低功耗等特点.AMBA规范中包括了AHB系统总线和APB外设总线. AHB主要用于高性能模 ...

  4. 【CF】Round #618 div2 C(文末有技巧)

    目录 round #618 div2 C(文末有技巧) 题目: 样例输入输出 思路 小技巧(拿小本本记下来) round #618 div2 C(文末有技巧) 这是题目链接->链接 题目: 原题 ...

  5. Module build failed: Error: Plugin/Preset files are not allowed to export objects, only functions.

    运行项目是提示Module build failed: Error: Plugin/Preset files are not allowed to export objects, only funct ...

  6. GroundingDINO(一种开集目标检测算法)服务化,根据文本生成检测框

    背景 最近发现一个叫GroundingDINO的开集目标检测算法,所谓开集目标检测就是能检测的目标类别不局限于训练的类别,这个算法可以通过输入文本的prompt然后输出对应的目标框.可以用来做预标注或 ...

  7. 【python基础】复杂数据类型-字典(遍历)

    一个字典可能只包含几个键值对,也可能包含数百万个键值对,所以Python支持字典遍历.字典可用于以各种方式存储信息,因此有多种遍历字典的方式:可遍历字典的所有键值对.键或值. 1.遍历所有的键值对 其 ...

  8. .NET7 for LoongArch64(国产龙芯)

    目前龙芯通过自己的指令集LA64支持了.Net7.0.1版本,一同被支持的有Ruby,Nodejs,Java,Electron,Python等.原文:在此处 龙芯.Net7 sdk下载地址: http ...

  9. 洛谷 P8026 [ONTAK2015] Bajtocja

    简要题意 有 \(d\) 张初始为空的无向图,每张中都有 \(n\) 个点,标号从 \(1\) 到 \(n\),\(m\) 次操作,每次往一张图加一条边,并询问有多少有序数对 \((a, b)\) 使 ...

  10. 怎么让英文大预言模型支持中文?(一)构建自己的tokenization

    代码地址:https://github.com/taishan1994/sentencepiece_chinese_bpe Part1前言 目前,大语言模型呈爆发式的增长,其中,基于llama家族的模 ...