Power BI中Power Query Post请求报400错误,Postman正常问题排查
问题分析与解决方案
嘿,我来帮你搞定这个400错误的问题!你用Postman能成功但Power Query报错,核心原因是请求头声明的Content-Type和实际发送的请求体格式不匹配,服务器收到后识别不了,就返回了Bad Request。
错误根源拆解
你在代码里设置了Headers = [#"Content-Type"="application/x-www-form-urlencoded"],这告诉服务器“我发的是表单编码的键值对数据”,但你的body却是一个JSON字符串:
body = "{ \"grant_type\": \"password\", \"client_id\": \"XXXXXXXX\", ... }"
这种矛盾的格式就是服务器拒绝请求的原因——它在等表单格式的数据,结果收到了JSON,自然解析失败。而Postman里你应该是选择了x-www-form-urlencoded选项直接输入键值对,所以能正常工作。
修正后的Power Query代码
我们把请求体改成服务器期望的表单格式,用Uri.BuildQueryString来生成规范的编码内容,避免手动拼接出错:
let url = "https://XXXXXXXXXX/OAuth/Token", // 用键值对定义参数,而非JSON字符串 formData = [ grant_type = "password", client_id = "XXXXXXXX", client_secret = "XXXXXXXXX", redirect_uri = "https://XXXXXXX/home/", username = "user", password = "password" ], // 将键值对转换为x-www-form-urlencoded格式的字符串 body = Uri.BuildQueryString(formData), Source = Json.Document(Web.Contents(url, [ Headers = [#"Content-Type"="application/x-www-form-urlencoded"], Content = Text.ToBinary(body) ])), #"Converted to Table" = Record.ToTable(Source) in #"Converted to Table"
另一种可能(如果服务器支持JSON格式)
如果你的Postman测试用的是Raw JSON格式,那你需要把请求头的Content-Type改成application/json,同时保持body的JSON格式:
let url = "https://XXXXXXXXXX/OAuth/Token", body = "{ ""grant_type"": ""password"", ""client_id"": ""XXXXXXXX"", ""client_secret"": ""XXXXXXXXX"", ""redirect_uri"": ""https://XXXXXXX/home/"", ""username"": ""user"", ""password"": ""password"" }", Source = Json.Document(Web.Contents(url, [ Headers = [#"Content-Type"="application/json"], Content = Text.ToBinary(body) ])), #"Converted to Table" = Record.ToTable(Source) in #"Converted to Table"
不过这种情况概率较低,毕竟你Postman能成功,大概率是用了表单编码的方式。
验证小技巧
你可以打开Postman的「Code」功能(右上角),选择「Power Query」格式,直接对比它生成的代码和你写的代码,就能快速定位差异啦!
内容的提问来源于stack exchange,提问作者Naira
相关产品推荐
相关产品推荐

