Nodejs 发送HTTPS请求发生错误

测试项目时发现发送一次PUT请求,但是失败了。返回了400请求错误,请求代码部分如下:

  var postdata;
  options.headers = {
      "Content-Length" : "0",
      "Content-Type"   : "application/json",
      "Authorization"  : "Basic "+base64.base64encode(LoginInfo.username+":"+LoginInfo.password)//base64 username:password
  }
  //参数
  if(method == "get"){
      if(!isEmptyObject(data)){
          options.url = options.url +"?"+ qs.stringify(data);
      }
  }else{
      if(!isEmptyObject(data)){
          postdata = JSON.stringify(data);
          options.headers['Content-Length'] = '' + postdata.length;
      }
  }

看了自己下发的参数包含了中文

{"spec":{"name":"堡垒"}}

感觉跟 Content-Length 有关。

在http的协议中Content-Length首部告诉浏览器报文中实体主体的大小。这个大小是包含了内容编码的,比如对文件进行了gzip压缩,Content-Length 就是压缩后的大小。
因为 Content-Length 是计算请求参数的字节数,而非字符数.而JSON.stringify(param).length返回的是字符数.含中文字符的情况下

console.log('堡垒'.length) //长度为2
console.log(Buffer.byteLength('堡垒', 'utf8')); //6 每个汉字长度为3 

Content-Length 小于真实长度, 无法解析数据, 从而返回错误.需要把 Content-Length 长度改为

if(!isEmptyObject(data)){
    postdata = JSON.stringify(data);
    options.headers['Content-Length'] = '' + Buffer.byteLength(postdata,'utf8');
}

你可能感兴趣的:(Nodejs 发送HTTPS请求发生错误)