本人 node版本为 v7.8 在使用 http.request方法时,无法发送post请求,当注释Content-Length时可发送请求
但是我使用 Content-Length长度为 序列化后的长度,所以我想请教下,为什么无法发送次请求。
此时长度都为71,为何无法发送post请求,当注释掉后可发送请求
再次谢谢各位大佬
@i5ting 请教下 狼叔
http 内容实体 res.write(body) 发了吗?
@vincentLiuxiang 没有啊,没有发送这个请求
@vincentLiuxiang 他不走http.request这个方法
我猜不加Content-Length
的时候它也是走了http.request
这个方法,只不过报错了,你没捕捉error
吧?
后面的代码被你的图片挡住了,也没看清。。。
@imhered 我去掉conteng-length 确实可以发 post请求,我打印状态码是 200 ,但是 res.on(‘data’,fn);这个事件没有触发
你把完整的错误信息贴出来,不然完全不知道你在说什么,还有 @imhered 说的也可能对。
@vincentLiuxiang 第一张图为 http的响应头信息,确实发送了post,但是data事件没触发,这是我 注释掉Content-length之后发送的请求,如果不注释,他不走这个 request方法
@zhang962976642 res.on('data',cb)
这个是正确的情况下才会监听到该事件? error
你监听了么?
上你完整的代码
@imhered 麻烦你了
@zhang962976642 你这个截图实在不好调啊,我给你上个正确代码吧,我之前写的
var iapdata = JSON.stringify(iapdata);
var url = 'buy.itunes.apple.com'
opt = {
method: 'POST',
host: url,
port: 443,
path: '/verifyReceipt',
headers: {
'Content-Type': 'application/json',
'Content-Length': iapdata.length
}
},
request = require('https').request(opt, function (res) {
if (res.statusCode === 200) {
var body = "";
res.on('data', function (data) {
body += data;
}).on('end', function () {
// do something
});
} else {
// do something
}
}).on('error', function (e) {
// error logic
});
request.write(iapdata + "\n");
request.end();
我这里是https请求所以端口是443,你的是http端口80没错
@imhered 我想转发post请求,怎么携带这两个参数
你这 length
不对吧?有中文。
@xadillax 我用postman模拟就没问题
@zhang962976642 我代码里的iapdata
就相当于你的data
@zhang962976642 post 请求,你的方法里没有把 body 发出去啊, 在 _req.end() 之前 先 _req.write(body)
_req.write(data)
_req.end()
- 客户端发送给服务端,没必要设置 content-length, http 模块会自己去检测 内容实体 (即,_req.write(data) 的入参 data 大小), 然而你设置了 content-length,但是不发body,服务端可能在等待body,因此就像你说的不走request,是因为服务端还没响应,其callback暂不执行。
- 注释content-length后,服务端不会傻等客户端发送 内容实体,因此会响应客户端。而 res.on(‘data’, () => {}), 不执行,这个说明服务端仅给你响应了 请求行,和请求头,没有给你发 http 内容实体。
@zhang962976642
实在不行就用 request模块吧,我以前也是用http
后来用了request
模块发现不要太爽
@vincentLiuxiang 您好我现在改成这样了 可是这样为何还是没有数据
@imhered @vincentLiuxiang 谢谢二位, 完美解决 确实是没有发送 req.write()导致没有请求题的问题 ;
@zhang962976642 建议好好看看 http 协议 。。。不然,以后出问题了靠猜是没用的