使用JavaScript fetch调用Gemini API OpenAI兼容接口时出现400 INVALID_ARGUMENT错误
使用JavaScript fetch调用Gemini API OpenAI兼容接口时出现400 INVALID_ARGUMENT错误
看起来问题出在请求体的序列化方式上!你的curl请求能正常工作是因为它发送的是格式完全合规的JSON,但你用Bruno生成的JavaScript代码里,手动拼接了JSON字符串,这很容易埋下隐藏的格式错误,导致API无法正确解析你的请求。
问题根源
你当前代码里的body是手动拼接的转义字符串:
body: '{\"model\":\"gemini-1.5-flash\",\"messages\":[{\"role\":\"user\",\"content\":\"Explain how AI works\"}]}'
虽然表面上和curl的结构一致,但手动处理转义字符很容易出错——可能存在看不见的格式问题(比如多余的转义、缺失的逗号,或者字符串拼接时的隐形错误),导致API收到的JSON不符合规范,直接返回INVALID_ARGUMENT错误。
修正方案
改用JSON.stringify()自动序列化JavaScript对象,这是处理JSON请求体最可靠的方式,能100%保证生成的JSON格式正确。修正后的代码如下:
const url = 'https://generativelanguage.googleapis.com/v1beta/openai/chat/completions'; const options = { method: 'POST', headers: { 'content-type': 'application/json', authorization: 'Bearer MY_API_KEY' // 记得替换成你真实的API密钥 }, body: JSON.stringify({ model: "gemini-1.5-flash", messages: [ { role: "user", content: "Explain how AI works" } ] }) }; try { const response = await fetch(url, options); const data = await response.json(); console.log(data); } catch (error) { console.error(error); }
为什么这样能解决问题?
JSON.stringify()会自动处理所有JSON格式的细节:
- 正确转义字符串中的特殊字符
- 确保对象的键和值用双引号包裹
- 自动处理数组和对象的嵌套结构
- 不会出现多余的逗号或缺失的引号
这样API收到的请求体和curl发送的完全一致,自然就能正常处理了。
额外检查点
虽然你说API密钥没问题,但还是可以快速确认这几点:
- 代码中的
MY_API_KEY已经替换成了真实有效的密钥 - 请求头的
authorization拼写正确(和curl保持一致的小写开头) content-type确实是application/json,没有拼写错误
备注:内容来源于stack exchange,提问作者Muhammad Dyas Yaskur
相关产品推荐
相关产品推荐

