nodejs手写简单http-server,post请求

作者 likaiqiang 日期 2017-03-11
nodejs手写简单http-server,post请求

在与后端程序员调试接口时,往往会发生一些诡异的问题。比如,我本地用json-server模拟数据没什么问题,可为什么一换上真实的接口往往不是那么顺利,有时通过谷歌能解决一部分问题,大多数情况下,总是去麻烦后端程序员,这个为啥是这样,这个为啥是那样,一次二次这样可以,次数多了,人家也会烦,况且,不让我亲眼看一下一条post请求发送到后台到底发生了什么,心里难免有些痒痒。

最近研究vue+webpack,顺带研究nodejs,正好可以利用nodejs搭一个简单的http-server,用postman发送请求,node-inspector调试nodejs来拦截postman发来的请求,这样就可以达到我的目的了。

理想是美好的,现实总是残酷的,在使用node-inspector的过程中出现了一个bug,据说node4.X版本以上都存在这个问题,没办法,只能安装两个node版本了,看我博客如何在windows上管理多个node

首先我的目录结构是这样的

index.js

var PORT = 8000;
var http = require('http');
var url = require('url');
var querystring = require("querystring");
var postData = null;
function cb(req,res){
var method = req.method;
var url = req.url;
var headers = req.headers;
var userAgent = headers['user-agent'];

var body = [];
req.on('data', function(chunk) {
body.push(chunk);
}).on('end', function() {
body = Buffer.concat(body).toString();
});
req.on('error', function(err) {
console.error(err.stack);
});

res.write('ok');
res.end();
}
var server = http.createServer();

server.on('request',cb);


server.listen(PORT,'127.0.0.1')
console.log('server runing at http://127.0.0.1:'+PORT)

安装node-inspector

npm i node-inspector -g

执行node-inspector

node-inspector

执行index.js

supervisor --debug index.js

打开 http://127.0.0.1:8080/?port=5858 ,然后下断点拦截http请求。

然后就可以愉快的用postman给本地服务器发请求了。

服务器搭完了,该说正事了,初学前端时,知乎上一篇文章说,前端应该熟悉http协议,今天才深刻体会到这句话的重要。

前后端对接时,两个人都懂http那是最好不过了,最起码也要一方懂,如果两方都不懂,那就尴尬了。

先说postman

发送post、put或者delete请求时会有这四个选项,其实是三种数据格式外加一种自定义的。

x-www-form-urlencoded (Content-Type=application/x-www-form-urlencoded)是 html 表单提交时默认的数据格式,使用这种格式提交数据时,后台(nodejs,后同)会收到诸如 a=1&b=2 这样的字符串。

form-data 是html5新加的提交数据格式,用法这里暂且不论。

binary主要用于二进制文件的传输。

raw是自定义数据格式

test 表示我给服务器发的是个纯文本

JSON 表示我给服务器发的是JSON字符串

javascript 表示我给服务器发的是js代码

xml 表示我给服务器发的是xml代码

html 表示我给服务器发的是html

那服务器是怎么知道这些的,每条http请求都有个content-type属性,选择上面不同的数据格式,postman都会生成不同的content-type,服务器根据httpRequest的content-type判断client提交了那种类型的数据,调用不同的方法解析数据。

伪代码:

var http = require('http');
var qs = require('qs');
var server = http.createServer();
server.on('request',(req,res)={
var method = req.method;
var headers = req.headers;
var type = headers['content-type'];
var body = req.body;
var formatData = null;
switch(type){
case 'application/x-www-form-urlencoded': formatData = qs.parse(body);break;
case 'application/json': formatData = JSON.parse(body);break;
case 'text/plain': //调用相应方法
......
}
//formatData,干其他事,存入数据库什么的
})