一 发现问题
近期一直在做SDK方面的对接,保证其他用户能正常对接API,昨天晚上有人发过来一段从Postman 转过来的curl 说是掉不通,问我为啥.
PostMan版本 Version 11.20.0 (11.20.0)
好的问题开始了;
下面是用户的curl
curl --location 'https://api.******.com/v1/images/generations' \
--header 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiI3OTUwZTMyMmJkMDQ0ZmIxOTE0MDZlNzVkM' \
--header 'Content-Type: application/json;charset=UTF-8' \
--data '{
"model": "v1",
"prompt": "帮我生成图片:画一张旅行青蛙游玩西湖的图片,画面要有西湖断桥和三潭印月,风格偏卡通。尺寸 9:16",
"aspect_ratio": "9:16"
}'
报错 : 1200 , 我们内部的含义是请求参数非法;
二 怀疑是请求参数不对
报错信息是请求参数非法所以直接怀疑请求参数的问题, 但是curl 成功了, 自己把参数频道自己的脚本里也成功了 神奇....
三 怀疑是PostMan发错了请求
因为PostMan会帮你生成很多header 所以自己也开始去header.
这几个全去了,结果引发更大的问题了
请求过去直接报错: socket hang up
然后就各种百度,也没查到具体原因;
四 求救Fidder
一试再试,还是没有成功, Fidder 可以抓包http的请求, 和在终端里执行的curl 一对比 找到问题了;
1) 开启fidder监控的curl
2) 发现curl的header里多出了好多东西:
3) Fiddler 监控 PostMan
查看Fiddler配置:
修改PostMan配置代理: 改成Fiddler监控的端口号;
4) PostMan 重新请求查看Fiddler 对比一下
发现两者是header不同只发了一遍请求证书,没有第二步真实请求https接口
五 修改PostMan header
1) 增加 Host RequestHeader
还是报错如下:
2) 增加去掉自定义content-type 用默认 还是报错
3) 增加content-length 终于成功了
六 总结原因
总结原因: 还是对HTTP 和PostMan不熟
后面查到问题
1) 对于https来说host请求头是必须的
host字段用于指明请求将要发送到的服务器的主机名和端口号(如果指定了端口号的话)。这个信息对于服务器来说至关重要,因为它需要根据Host字段的值来确定将请求路由到哪个具体的虚拟主机或应用程序上。
如果HTTPS请求中缺少Host字段,服务器可能无法正确解析请求并将其路由到目标虚拟主机或应用程序上。这可能导致请求失败或返回错误状态码(如400 Bad Request)。因此,在构建HTTPS请求时,必须确保包含正确的Host字段。
2) 在HTTP POST请求中,如果请求体包含数据(如表单提交、文件上传等),则Content-Length通常是必需的
是因为接收方需要知道请求体的确切大小,以便正确读取和处理数据
综合来说还是这两个请求不同, 终于试出来结果了, 但还是没有明白 ,为什么客户发来的第一次culr命令 import到PostMan的时候就是请求不同
找到问题之后重新试了试请求成功了, 第一遍是路径引起的,改掉后就成功报错401 autho error了
可能当时比较乱以为是Header问题改错了吧....
参考原文: Fiddler抓取postman 发送的数据(六)_fiddler中能通过但postman不能通过-CSDN博客
版权归原作者 张三333 所有, 如有侵权,请联系我们删除。