创建新的服务器


创建一个简单的服务

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的更多相关文章

  1. NodeJs之OS

    OS Node.js提供了一些基本的底层操作系统的模块OS. API var os = require('os'); console.log('[arch] 操作系统CPU架构'+os.arch()) ...

  2. NodeJs之Path

    Path模块 NodeJs提供的Path模块,使得我们可以对文件路径进行简单的操作. API var path = require('path'); var path_str = '\\Users\\ ...

  3. NodeJs之调试

    关于调试 当我们只专注于前端的时候,我们习惯性F12,这会给我们带来安全与舒心的感觉. 但是当我们使用NodeJs来开发后台的时候,我想噩梦来了. 但是也别泰国担心,NodeJs的调试是很不方便!这是 ...

  4. NodeJs在Linux下使用的各种问题

    环境:ubuntu16.04 ubuntu中安装NodeJs 通过apt-get命令安装后发现只能使用nodejs,而没有node命令 如果想避免这种情况请看下面连接的这种安装方式: 拓展见:Linu ...

  5. NodeJs之child_process

    一.child_process child_process是NodeJs的重要模块.帮助我们创建多进程任务,更好的利用了计算机的多核性能. 当然也支持线程间的通信. 二.child_process的几 ...

  6. nodejs进阶(6)—连接MySQL数据库

    1. 建库连库 连接MySQL数据库需要安装支持 npm install mysql 我们需要提前安装按mysql sever端 建一个数据库mydb1 mysql> CREATE DATABA ...

  7. 图片访问实时处理的实现(nodejs和php)

    我在访问时光网.网易云音乐等网站时,发现将它们页面中的一些图片URL修改一下就可以得到不同尺寸的图片,于是思考了其实现方案,我的思路是:URL Rewrite + 实时处理 + 缓存,对用户请求的UR ...

  8. nodejs进阶(4)—读取图片到页面

    我们先实现从指定路径读取图片然后输出到页面的功能. 先准备一张图片imgs/dog.jpg. file.js里面继续添加readImg方法,在这里注意读写的时候都需要声明'binary'.(file. ...

  9. nodejs进阶(3)—路由处理

    1. url.parse(url)解析 该方法将一个URL字符串转换成对象并返回. url.parse(urlStr, [parseQueryString], [slashesDenoteHost]) ...

  10. 【原】nodejs全局安装和本地安装的区别

    来微信支付有2年多了,从2年前的互联网模式转变为O2O模式,主要的场景是跟线下的商户去打交道,不像以往的互联网模式,有产品经理提需求,我们帮忙去解决问题. 转型后是这样的,团队成员更多需要去寻找业务的 ...

随机推荐

  1. HTML复习

  2. 关于 parseInt 的一道有意思的面试题

    看完标题,入坑过的同学脑海里很快会浮现出这道经典面试题,没碰到过的同学不妨跟着楼主先来复习一遍 parseInt 的用法(主要参考 MDN). parseInt 是 JavaScript 中的一个全局 ...

  3. C#实体类生成XML与XML Schema文档

    一.实体类生成XML private void CreateXML() { Type[] objType = DBEntityRegst(); foreach (var item in objType ...

  4. VUE2.0实现购物车和地址选配功能学习第三节

    第三节 使用v-for渲染商品列表 1.使用vue-resource插件引入json数据 (注:在谷歌中调试打断点-- ,console还可以输出vm,res等属性列表,或者productList等一 ...

  5. KMP算法的优化与详解

    文章开头,我首先抄录一些阮一峰先生关于KMP算法的一些讲解. 下面,我用自己的语言,试图写一篇比较好懂的 KMP 算法解释. 1. 首先,字符串"BBC ABCDAB ABCDABCDABD ...

  6. 为什么Node.JS会受到青睐?

    为什么会是Node.JS? 从技术上讲,Node.JS不是一个非常好的项目,Node.JS只是把一个烂想法实现到了可以接受的程度. 但是人们为什么愿意用Node.JS? 从历史看来,成功的项目从来都不 ...

  7. 1084: [SCOI2005]最大子矩阵

    1084: [SCOI2005]最大子矩阵 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1325  Solved: 670[Submit][Stat ...

  8. docker X509 证书错误的终极解决办法

    最近在做Docker相关的东西,发现只要一pull镜像,就出现如下的ERROR x509: certificate signed by unknown authority. 调查后发现,是公司IT把h ...

  9. CoreAnimation 图层几何学

    CoreAnimation 图层几何学 博客园MakeDown支持不佳,如有需要请进GitHub 图层几何所讲主要是有关图层的位置,尺寸等几何类属性. 布局 在UIView中与位置,尺寸有关的属性有 ...

  10. Omi框架学习之旅 - Hello World 及原理说明

    学什么东西都从hello world开始, 我也不知道为啥. 恩,先上demo代码, 然后提出问题, 之后解答问题, 最后源码说明. hello world - demo: class Hello e ...