HTTP Headers中 Content-Length问题
发布于 2 年前 作者 zhang962976642 2987 次浏览 来自 问答

本人 node版本为 v7.8 在使用 http.request方法时,无法发送post请求,当注释Content-Length时可发送请求
但是我使用 Content-Length长度为 序列化后的长度,所以我想请教下,为什么无法发送次请求。 4.png 3.png 此时长度都为71,为何无法发送post请求,当注释掉后可发送请求 再次谢谢各位大佬

20 回复

@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 1.png 2.png 3.png 第一张图为 http的响应头信息,确实发送了post,但是data事件没触发,这是我 注释掉Content-length之后发送的请求,如果不注释,他不走这个 request方法

@zhang962976642 res.on('data',cb) 这个是正确的情况下才会监听到该事件? error你监听了么? 上你完整的代码

@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请求,怎么携带这两个参数image.png

你这 length 不对吧?有中文。

@xadillax 我用postman模拟就没问题 image.png

@zhang962976642 我代码里的iapdata就相当于你的data

@zhang962976642 post 请求,你的方法里没有把 body 发出去啊, 在 _req.end() 之前 先 _req.write(body)

_req.write(data)
_req.end()
  1. 客户端发送给服务端,没必要设置 content-length, http 模块会自己去检测 内容实体 (即,_req.write(data) 的入参 data 大小), 然而你设置了 content-length,但是不发body,服务端可能在等待body,因此就像你说的不走request,是因为服务端还没响应,其callback暂不执行。
  2. 注释content-length后,服务端不会傻等客户端发送 内容实体,因此会响应客户端。而 res.on(‘data’, () => {}), 不执行,这个说明服务端仅给你响应了 请求行,和请求头,没有给你发 http 内容实体。

@zhang962976642 实在不行就用 request模块吧,我以前也是用http 后来用了request模块发现不要太爽

@vincentLiuxiang 您好我现在改成这样了 image.png image.png 可是这样为何还是没有数据

@imhered @vincentLiuxiang 谢谢二位, 完美解决 确实是没有发送 req.write()导致没有请求题的问题 ;

@zhang962976642 建议好好看看 http 协议 。。。不然,以后出问题了靠猜是没用的

回到顶部