记 GET 请求的错误
GET 请求一直以来都是把参数放在 url 的. 但是今天发现不行了, 放在 url 会出以下错误:
get : http://192.168.xxx.xxx/xxx
options: {
host: '192.168.xxx.xxx',
port: '80',
path: '/xxx',
method: 'get',
headers: { 'Content-Type': 'application/json;charset=utf-8' }
}
Error: socket hang up
at connResetException (node:internal/errors:691:14)
at Socket.socketOnEnd (node:_http_client:466:23)
at Socket.emit (node:events:538:35)
at endReadableNT (node:internal/streams/readable:1345:12)
at processTicksAndRejections (node:internal/process/task_queues:83:21) {
code: 'ECONNRESET'
}
试了一下, 浏览器, postman, 或者经过 nginx 代理都是可以正常获取结果的.
发请求的程序, 如果采用类似 post 一样, 把参数放在 body 也是可以正常获取结果的.
为什么会这样? 难道现在服务端现在要求把 GET 请求的参数放在 body? 一些工具做了兼容? 实际上 url 中的参数在发送的时候会放在 body?
不能委曲求全, 还是要把参数放在 url中. 后来发现问题所在了. 因为客户端是 Node.js 写的, 习惯性的加上默认值:
body = body || {};
这样, body 就不是空的, 是 “{}” 就不行了. 这就是真正的原因. 默认 GET 又是不传 Content-Length 的.
如果不想改变这样的规矩(项目中). 那就要传一个正确的 ‘Content-Length’:
headers: {
...
'Content-Length': 2
}
这样问题就解决了.
通常如果遇到请求发送的问题, 而检查后发现基本没有什么问题, 可以从以下几个方面来排查:
- Content-Length, 如果服务端是 C, 那就一定要传, 因为不传, 遇到结束符号, 就认为结束了, 可能获取不到全部的参数
- url 中是否有非法字符, 要不要
decodeURIComponent