测试项目时发现发送一次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');
}