如标题所示,这次笔记一个工作中遇到的小坑,虽说小却楞是花了我几大小时的时间。当时的背景是这样的,我需要在客户端这边发送一个http的POST请求,然后服务器根据请求执行相应的db操作。代码类似下面这样子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| var http = require('http');
var bookBody = { "title": "黑客与画家", "price":9.89 }
var bookBodyString = JSON.stringify(bookBody); var options = { host: 'localhost', port:'3000', path: '/books', method: 'POST', headers: { 'Accept': '/', 'Content-Type':'application/json', 'Content-Length': bookBodyString.length } };
var req = http.request(options, function(res) { res.setEncoding('utf8'); res.on('data', function(data) { console.log(data); });
res.on('err',function(data){ console.log(data); }); });
req.write(bookBodyString); req.end();`
|
结果代码执行过后,对方的服务器给挂掉了,当然我这边也就没有响应到正确的数据,服务器报出了语法的错,类似‘无法解析的结尾’。当时我就在想,这部分的请求代码是我直接拷过来的(话说直接拷代码是非常‘危险’的动作),拷的这部分代码在之前是成功执行的,只是我这边稍微改了一下,难不成是因为这次改动的原因,然后我回滚代码,让它几乎保持了与拷贝之前一致性,接着再执行,晕~依然崩溃。仔细对比了代码,发现剩下不同的就只有新的代码里面消息体包含了中文。于是换成英文再执行,OK。那依这样看是不是就是该服务端的问题呢,即对方在接收数据时没有做正确的处理,或者没有做中文编码之类的处理。于是,我把这个问题反馈给了作者,这篇的6楼是我的反馈记录。大家可以看看。
那从上面的链接我们可以牢记一个点是,在请求的头部,content-length它表示的是所在消息体的字节数而不是字符个数,明白这个道理的话就释然了