Android中OpenLibrary API请求异常:URL查询与代码/Postman结果不一致
我之前折腾OpenLibrary API的时候也碰到过类似的坑,直接浏览器访问正常,但代码/Postman请求就拉胯,给你几个实用的排查方向和解决办法:
务必添加User-Agent请求头
浏览器访问时会自动带上符合规范的User-Agent,而自定义请求(代码/Postman)如果没加这个头,OpenLibrary的服务器可能会把你当成机器人,先卡你20秒再返回空数据。赶紧在请求里加个模拟浏览器的UA,比如:User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36我当时就是加了这个头之后,Postman立刻返回正常数据了。
先给
docs列表做空判断,堵住NPE
既然返回的是空JSON,那解析后docs肯定是null,直接调用getItemCount()里的方法自然会炸。先把代码改一下,做个防御性判断:public int getItemCount() { // 先判断响应和docs是否为空 if (this.response == null || this.response.getDocs() == null) { return 0; // 或者抛出更明确的异常提示 } return this.response.getDocs().size(); }这样不仅能避免NPE,还能快速确认是不是返回数据为空导致的问题。
检查请求参数的编码和传递
虽然你用的是author=Plato这种简单参数,但代码里如果是手动拼接URL,可能不小心出现了空格、编码错误之类的问题。建议用URL编码工具处理参数值,或者用HTTP客户端的参数构建方法(比如Java的URIBuilder)来生成请求URL,避免手动拼接的坑。排查网络环境和代理
如果你的代码运行环境有代理服务器,或者Postman开了代理,可能请求被拦截了,导致延迟后返回空。试试把代理关掉,或者和浏览器用同一个网络环境再测一遍。确认是否触发了API限流
OpenLibrary的API有速率限制,虽然直接访问没问题,但如果你的代码短时间内发了太多请求,可能被限流了。可以看看响应头里有没有X-RateLimit-Remaining这类字段,确认是不是被限流了。如果是,就加个请求间隔再试。
内容的提问来源于stack exchange,提问作者KovaxTzeentch

