NodeJs之http
创建新的服务器
创建一个简单的服务
var http = require("http");
var server = http.createServer();
server.listen(8888);
这段代码只会启动一个侦听8888端口的服务器,不会应答,不会任何事,所以是无意义的。
下面创建一个有意义的服务器
var http = require("http");
http.createServer(function(request, response) {
console.log('get request');
response.writeHead(200, {"Content-Type": "text/plain"});
response.write("Hello World");
response.end();
}).listen(8888);
结果:
//服务端
$ node http.js
get request
//客户端
$ curl localhost:8888
Hello World
这里我们通过response.writeHead发送一个请求状态码和内容类型,使用 response.write() 函数在HTTP响应主体中发送文本“Hello World"。
response.end()这个方法告诉服务器,所有的响应头和响应体已经发送,服务器可以认为消息结束。
在curl下测试不出我们请求两次的问题,我们在浏览器端输入:http://localhost:8888/
Request Pathname Url {
protocol: null,
slashes: null,
auth: null,
host: null,
port: null,
hostname: null,
hash: null,
search: null,
query: null,
pathname: '/',
path: '/',
href: '/' }
Request Pathname Url {
protocol: null,
slashes: null,
auth: null,
host: null,
port: null,
hostname: null,
hash: null,
search: null,
query: null,
pathname: '/favicon.ico',
path: '/favicon.ico',
href: '/favicon.ico' }
发现请求了两次。
注意:当我们在服务器访问网页时,我们的服务器可能会输出两次“get request”。那是因为大部分浏览器都会在你访问 http://localhost:8888/ 时尝试读取 http://localhost:8888/favicon.ico )
解析请求路径
这时候我们需要另外一个模块,url
var http = require("http");
var url = require("url")
http.createServer(function(request, response) {
var pathname = url.parse(request.url).pathname;
console.log('Request Pathname ',pathname);
response.writeHead(200, {"Content-Type": "text/plain"});
response.write("Hello World");
response.end();
}).listen(8888);
发送请求:localhost:8888/demo/test
curl localhost:8888/demo/test
查看解析的url结果:
Request Pathname /demo/test
我们取到浏览请求的url,这个可以帮助我们做路由映射。
url.parse很神奇,那我们再来多了解一点。
将原来的代码处url.parse修改一下
pathname = url.parse(request.url)
发送请求:http://localhost:8888/select?page=10&blog=nodejs
Url {
protocol: null,
slashes: null,
auth: null,
host: null,
port: null,
hostname: null,
hash: null,
search: '?page=10&blog=nodejs',
query: 'page=10&blog=nodejs',
pathname: '/select',
path: '/select?page=10&blog=nodejs',
href: '/select?page=10&blog=nodejs' }
这就是整个解析后的url。
解析请求参数
使用querystringnodejs自带的模块解析参数
修改一下代码:
var http = require("http");
var url = require("url");
var querystring = require('querystring')
http.createServer(function(request, response) {
var pathname = url.parse(request.url);
var query = querystring.parse(pathname.query);
console.log('query ',query);
response.writeHead(200, {"Content-Type": "text/plain"});
response.write("Hello World");
response.end();
}).listen(8888);
query { page: '10', blog: 'nodejs' }
querystring.parse()有点类似于JSON.parse()
querystring.stringify()有点类似于JSON.stringify()
查看有querystring 哪些方法:
> var querystring = require('querystring')
undefined
> querystring
{ unescapeBuffer: [Function],
unescape: [Function],
escape: [Function],
encode: [Function],
stringify: [Function],
decode: [Function],
parse: [Function] }
发送post请求
这个例子有点复杂。
我们先创建一个服务器localhost:8000,然后通过自定义路由来处理请求。这里我们还是用http.request()发送了一个到localhost:8000/test的请求,并尝试获取post的数据。
var http = require("http");
var url = require("url");
var querystring = require('querystring')
http.createServer(function(request, response) {
var pathname = url.parse(request.url);
var query = querystring.parse(pathname.query);
if (pathname.pathname === '/getDo') { //处理localhost:8000/getDo
response.writeHead(200, { "Content-Type": "text/plain" });
response.write("Hello World");
response.end();
} else if (pathname.pathname === '/postDo') { //处理localhost:8000/postDo
postTest(response);
} else if (pathname.pathname === '/test') {
var jsonData = '';
request.on("data", function(data) {
jsonData += data
console.log('接受数据中。。。');
});
request.on("end", function() {
console.log('接受完成!');
console.log(querystring.parse(jsonData));
})
}
}).listen(8888);
function postTest(response) {
var postData = querystring.stringify({
'msg': 'Hello World!'
})
//发送post请求localhost:8000/test并带上参数postData
var options = {
hostname: 'localhost',
port: 8888,
path: '/test',
method: 'POST',
headers: {
'Content-Type': '"text/plain',
'Content-Length': postData.length
}
};
var req = http.request(options);
req.write(postData);
req.end()
}
接受数据中。。。
接受完成!
{ msg: 'Hello World!' }
这里我们通过请求localhost:8000/postDo的时候,又通过http发送了localhost:8000/test这个请求,并通过req.write(postData)带上了post的参数。
应该这里没有使用任何框架,post的数据必须通过
var jsonData = '';
request.on("data", function(data) {
jsonData += data
console.log('接受数据中。。。');
});
request.on("end", function() {
console.log('接受完成!');
console.log(querystring.parse(jsonData));
})
这样的形式来拼接。
NodeJs之http的更多相关文章
- NodeJs之OS
OS Node.js提供了一些基本的底层操作系统的模块OS. API var os = require('os'); console.log('[arch] 操作系统CPU架构'+os.arch()) ...
- NodeJs之Path
Path模块 NodeJs提供的Path模块,使得我们可以对文件路径进行简单的操作. API var path = require('path'); var path_str = '\\Users\\ ...
- NodeJs之调试
关于调试 当我们只专注于前端的时候,我们习惯性F12,这会给我们带来安全与舒心的感觉. 但是当我们使用NodeJs来开发后台的时候,我想噩梦来了. 但是也别泰国担心,NodeJs的调试是很不方便!这是 ...
- NodeJs在Linux下使用的各种问题
环境:ubuntu16.04 ubuntu中安装NodeJs 通过apt-get命令安装后发现只能使用nodejs,而没有node命令 如果想避免这种情况请看下面连接的这种安装方式: 拓展见:Linu ...
- NodeJs之child_process
一.child_process child_process是NodeJs的重要模块.帮助我们创建多进程任务,更好的利用了计算机的多核性能. 当然也支持线程间的通信. 二.child_process的几 ...
- nodejs进阶(6)—连接MySQL数据库
1. 建库连库 连接MySQL数据库需要安装支持 npm install mysql 我们需要提前安装按mysql sever端 建一个数据库mydb1 mysql> CREATE DATABA ...
- 图片访问实时处理的实现(nodejs和php)
我在访问时光网.网易云音乐等网站时,发现将它们页面中的一些图片URL修改一下就可以得到不同尺寸的图片,于是思考了其实现方案,我的思路是:URL Rewrite + 实时处理 + 缓存,对用户请求的UR ...
- nodejs进阶(4)—读取图片到页面
我们先实现从指定路径读取图片然后输出到页面的功能. 先准备一张图片imgs/dog.jpg. file.js里面继续添加readImg方法,在这里注意读写的时候都需要声明'binary'.(file. ...
- nodejs进阶(3)—路由处理
1. url.parse(url)解析 该方法将一个URL字符串转换成对象并返回. url.parse(urlStr, [parseQueryString], [slashesDenoteHost]) ...
- 【原】nodejs全局安装和本地安装的区别
来微信支付有2年多了,从2年前的互联网模式转变为O2O模式,主要的场景是跟线下的商户去打交道,不像以往的互联网模式,有产品经理提需求,我们帮忙去解决问题. 转型后是这样的,团队成员更多需要去寻找业务的 ...
随机推荐
- 规范 : loading display & ui-view loading
angular 没有compile 完成的接口,最像的接口是$viewContentLoaded(router ui),但是一开始会开始跑,因为有ui-view 暂时解决方法是在body的loadin ...
- MAC本如何优雅的创建定时任务
在MACOS上设置定时任务大体有两种方案.一种是使用crontab,一种是使用Schedule,今天结合我的使用简单介绍一下. 先说一下背景,为什么MAC可以用crontab.如果使用过Linux的同 ...
- JavaWeb之MVC模式
一.什么是MVC设计模式? MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(View)和控制器(Contr ...
- 【2-26】string/math/datetime类的定义及其应用
一string类 (1)字符串.Length Length作用于求字符串的长度,返回一个int值 (2)字符串.TrimStart(); TrimStart():可删除前空格,返回一个stri ...
- Django REST framework使用ViewSets的自定义路由实现过程
在Django中使用基于类的视图(ClassView),类中所定义的方法名称与Http的请求方法相对应,才能基于路由将请求分发(dispatch)到ClassView中的方法进行处理,而Django ...
- CAS进行https到http的改造方案,结合cookie源码分析
先说具体的改造方案: 服务端: 一.CAS Server端的修改 1.找到cas\WEB-INF\deployerConfigContext.xml 对以下Bean增加参数p:requireSecur ...
- [SQL] SQL 基础知识梳理(七)- 集合运算
SQL 基础知识梳理(七)- 集合运算 目录 表的加减法 联结(以列为单位) 一.表的加减法 1.集合:记录的集合(表.视图和查询的执行结果). 2.UNION(并集):表的加法 -- DDL:创建表 ...
- Spark(开课吧笔记)
2016.07.14 1-Spark实战演练:Spark概述及生态环境 2.Spark实战演练:Spark vs Hadoop MapReduce 任意一条边有方向且不存在环路的图,一次执行所 ...
- jsp页面中从forEach里向action里面传递其中的一个对象
<c:forEach var="user" items="${users }"> <form action="user_update ...
- Alamofire源码解读系列(十一)之多表单(MultipartFormData)
本篇讲解跟上传数据相关的多表单 前言 我相信应该有不少的开发者不明白多表单是怎么一回事,然而事实上,多表单确实很简单.试想一下,如果有多个不同类型的文件(png/txt/mp3/pdf等等)需要上传给 ...