代码中发送HTTP请求返回404错误,Postman请求却正常
解决request库POST请求404但Postman正常的问题
我在代码里用request库发送POST请求,明明URL、参数和请求体都和Postman里的一模一样,但代码里总是返回404错误,Postman却能成功请求。我实在搞不懂哪里出问题了,相关代码如下:
const promisify = require('util').promisify; const { post, get, del } = require('request'); const postAsync = promisify(post); const post = async (url, payload) => { console.log('USER ID PAYLOAD',payload) return postAsync(url, { headers: { "Content-Type": "application/json", "Accept": "application/json" }, json: true, body: payload }) .then(response => { console.log('USER ID StAtUS CODE', response.url, response.body) if (response.statusCode >= 400) throw new Error(response.body.message || "An error occurred"); if (response.body && (response.body.status === 'error' || response.body.status === 'fail')) throw new Error(response.body.message || "An error occurred"); return response.body; }, error => { throw error; }) }
这种情况我之前也碰到过,大概率是request库的参数配置和Postman的默认行为有差异,你可以从这几个方向排查:
- 检查URL的编码差异:request库可能会自动对URL中的特殊字符进行编码,而Postman的处理方式可能不同。你代码里已经打印了
response.url,把这个URL和Postman中实际发送的URL(可以在Postman的"Console"里看完整请求URL)仔细对比,比如空格是转成%20还是+,或者某些路径参数的编码是否一致。 - 确认请求体的序列化结果:你设置了
json: true,request会自动把body序列化为JSON字符串,但有时候可能payload里的特殊值(比如日期对象、undefined)在序列化后和Postman里的不一致。你可以在代码里加一行console.log('Serialized body:', JSON.stringify(payload)),把这个结果和Postman里的请求体(Raw格式)对比,看看是否完全一致。 - 补全请求头匹配Postman:Postman会自动添加一些默认请求头,比如
User-Agent、Host等,而你的代码里只设置了Content-Type和Accept。有些服务器会校验这些头信息,你可以把Postman里的所有请求头都复制到代码的headers对象里,比如加上User-Agent: PostmanRuntime/7.32.3(换成你Postman实际的User-Agent值),再试一次。 - 排查request库的隐性问题:request库已经被官方标记为弃用状态,可能存在一些未被修复的隐性bug。你可以尝试改用更现代的HTTP库,比如axios,不仅API更简洁,也更容易排查问题。上面的代码用axios改写后大概是这样:
const axios = require('axios'); const post = async (url, payload) => { console.log('USER ID PAYLOAD', payload); try { const response = await axios.post(url, payload, { headers: { "Content-Type": "application/json", "Accept": "application/json", // 这里可以加上Postman里的其他请求头 "User-Agent": "PostmanRuntime/7.32.3" } }); console.log('USER ID StAtUS CODE', response.config.url, response.data); if (response.data && (response.data.status === 'error' || response.data.status === 'fail')) { throw new Error(response.data.message || "An error occurred"); } return response.data; } catch (error) { throw error.response ? error.response.data.message || "Request failed" : error.message; } };
内容的提问来源于stack exchange,提问作者King
相关产品推荐
相关产品推荐

