前两天陪儿子写学校的信息课作业,他要做一个查天气的小程序,代码写了半天,运行起来却总是拿不到数据。我一看错误提示,发现是API返回403,权限被拒。问题出在哪?不是网址错了,也不是网络问题,而是——请求头(Request Headers)没设置好。
什么是请求头?简单说就是‘敲门的礼貌方式’
就像你去别人家敲门,不能直接撞开,得先说一声‘你好,我是小明的爸爸’。网络请求也一样。当你让程序去访问某个API接口时,对方服务器会看你的‘身份介绍’,这个介绍就是请求头。
很多公开API现在都要求你在请求头里带上特定信息,比如告诉对方你是谁、用的是什么设备、能接受什么格式的数据。如果不带,或者乱写,服务器就可能直接拒绝你。
常见的几个请求头字段,其实没那么难
比如Content-Type,告诉对方你发的是什么类型的数据。如果你提交的是JSON,就得写:
Content-Type: application/json
再比如User-Agent,模拟浏览器访问。有些网站会屏蔽非浏览器的请求,加一句:
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36
就能让服务器觉得你是正常用户在操作。
孩子写Python爬虫,别忘了requests库里的headers参数
儿子用Python的requests库写代码,一开始只写了:
requests.get("https://api.weather.com/v1")
结果一直失败。后来加上了headers,立马通了:
headers = {
"User-Agent": "MyWeatherApp/1.0",
"Authorization": "Bearer your-api-key-here"
}
response = requests.get("https://api.weather.com/v1", headers=headers)
那个Authorization,就是他从老师给的文档里找到的密钥,相当于‘通行证’。不写它,就像没带学生证进图书馆,自然不让进。
现在的孩子学编程越来越早,接触API也不稀奇。但光会调用get、post还不够,得懂点‘社交礼仪’。请求头设对了,程序才能顺利拿到数据,不然折腾半天也白搭。
下次孩子说‘代码没错但跑不通’,不妨看看是不是少了这一小段配置。