微信小程序报"不在 request 合法域名列表中":配置步骤 + 免费成语/诗词 API 实战
给小程序加一个"每日一句"或"每日成语"卡片,功能上很简单,难的是那一堆平台限制。
这篇把域名配置一次讲清,然后给你一套能直接跑的完整代码。
先看这个报错
request:fail url not in domain list或者在控制台看到更完整的一句:
不在以下 request 合法域名列表中,请参考文档:https://developers.weixin.qq.com/…
十个小程序开发者九个撞过这个错。原因一句话:微信不允许小程序随便请求一个地址,你调用的接口域名必须先在小程序后台登记。
小程序网络请求的四条硬规矩
| # | 要求 | 说明 |
|---|---|---|
| 1 | 必须 HTTPS | http://直接拦截,没有商量 |
| 2 | 域名必须 ICP 备案 | 这是最容易忽略的一条,也是大多数人接第三方接口失败的原因 |
| 3 | 不能用 IP 地址或 localhost | 哪怕加了 https 也不行 |
| 4 | 域名必须在小程序后台登记 | 登记路径见下文 |
第 2 条是关键。网上大量免费接口要么是 http、要么是 IP 直连、要么域名没备案——这三类在小程序里全都用不了,不是你代码写错了。
选接口时先做三个检查:curl -I看是不是 https、ping 一下是不是 IP、去工信部备案查询确认域名有备案号。三个都过,才值得往下写代码。
配置步骤
登录 微信公众平台 →开发→开发管理→开发设置→ 往下找服务器域名→ 点「修改」→ 在request 合法域名里填上接口域名。
以我要用的接口为例,填:
https://www.hdemba.cn https://www.shop186.com三个必须注意的点:
- 只填域名,不填路径。填
https://www.hdemba.cn,不是https://www.hdemba.cn/api/daily。填完后,wx.request的 url 必须以这个域名开头,带不带www也要和后台完全一致。 - 服务器域名每月最多只能修改 5 次。别边想边填,先想清楚要把哪些域名加进来,一次配齐。
- 配置保存后等几分钟才会全网生效,立刻测试还是报错不用慌。
另外,开发阶段可以在微信开发者工具里临时跳过校验:详情 → 本地设置 → 勾选「不校验合法域名、web-view(业务域名)、TLS 版本以及 HTTPS 证书」。
但这个开关只对开发者工具有效。真机预览、体验版、正式版都会走真实校验,所以它只能帮你先写代码,不能替代配置。
选一个能用的免费接口
我用的这组接口是词海集和句悦集提供的,全部满足上面四条硬规矩(HTTPS、已备案、有域名、免费),一共 5 个:
| 接口 | 说明 |
|---|---|
GET https://www.hdemba.cn/api/daily | 每日成语(按日期轮换,同一天返回同一条) |
GET https://www.hdemba.cn/api/idiom | 随机成语 |
GET https://www.hdemba.cn/api/poem | 随机唐诗宋词 |
GET https://www.shop186.com/api/daily | 每日一言 |
GET https://www.shop186.com/api/quote | 随机名言,支持?theme=lizhi等 22 个主题 |
返回都是统一结构,errno === 0表示成功:
{"errno":0,"data":{"id":3521,"text":"希望是坚韧的拐杖,忍耐是旅行袋","author":"罗素","url":"https://www.shop186.com/mingyan/3521.html"},"from":"句悦集 https://www.shop186.com"}效果
左边是"每日一句"卡片,右边是"每日一诗 + 每日成语"的组合页。下面照着做一遍。
第一步:封装一个带缓存的请求
每日接口的特点是同一天返回同一条,那这一天的重复请求全是浪费。小程序里用wx.setStorageSync做本地缓存:
// utils/content.jsconstKEY="daily_quote";constpad=n=>(n<10?"0"+n:""+n);functiontoday(){constd=newDate();return`${d.getFullYear()}-${pad(d.getMonth()+1)}-${pad(d.getDate())}`;}functionloadDaily(){constcached=wx.getStorageSync(KEY)||null;if(cached&&cached.date===today())returnPromise.resolve(cached.data);returnnewPromise((resolve,reject)=>{wx.request({url:"https://www.shop186.com/api/daily",method:"GET",success:res=>{if(res.data&&res.data.errno===0){wx.setStorageSync(KEY,{date:today(),data:res.data.data});resolve(res.data.data);}else{reject(newError("接口返回异常"));}},fail:reject});});}module.exports={loadDaily};一个经典时区坑:取日期别用new Date().toISOString().slice(0, 10),它返回的是 UTC 日期——北京时间早上 8 点之前,它算出来的是"昨天",缓存就错位了。上面用本地时间自己拼,在哪台设备上都不会错。
第二步:页面逻辑
// pages/daily/daily.jsconst{loadDaily}=require("../../utils/content.js");Page({data:{text:"",author:"",loading:true,error:false},onLoad(){this.fetchDaily();},asyncfetchDaily(){this.setData({loading:true,error:false});try{constd=awaitloadDaily();this.setData({text:d.text,author:d.author,loading:false});}catch(e){// 接口挂了不影响页面其他功能,给个可重试的兜底this.setData({loading:false,error:true});}},onNext(){wx.request({url:"https://www.shop186.com/api/quote",method:"GET",success:res=>{if(res.data&&res.data.errno===0){this.setData({text:res.data.data.text,author:res.data.data.author});}}});}});第三步:结构与样式
<!-- pages/daily/daily.wxml --><viewclass="card"><viewclass="tag">今 日 金 句</view><viewclass="quote"wx:if="{{!loading && !error}}">{{text}}</view><viewclass="author"wx:if="{{!loading && !error}}">—— {{author}}</view><viewclass="tip"wx:if="{{loading}}">加载中…</view><viewclass="tip"wx:if="{{error}}"bindtap="fetchDaily">加载失败,点我重试</view><viewclass="btn"bindtap="onNext">换 一 句</view></view>/* pages/daily/daily.wxss */.card{margin:40rpx 30rpx;padding:40rpx 32rpx 28rpx;background:#faf8f4;border:1rpx solid #eee7dc;border-radius:24rpx;}.tag{font-size:22rpx;letter-spacing:6rpx;color:#a08e6f;text-align:center;}.quote{font-size:34rpx;line-height:1.9;color:#33302b;text-align:center;}.author{margin-top:24rpx;text-align:right;font-size:26rpx;color:#a09a90;}.tip{text-align:center;color:#a09a90;font-size:26rpx;padding:30rpx 0;}.btn{margin-top:30rpx;border:1rpx solid #e2d7c6;background:#fff;border-radius:40rpx;text-align:center;font-size:26rpx;color:#a08e6f;padding:14rpx 0;}想换成诗词卡片,把接口换成https://www.hdemba.cn/api/poem即可,paragraphs是逐句数组,<text>里用\n连接就能多行展示。
小程序和 Web 不一样的三个地方
① 小程序没有跨域问题。
Web 里的 CORS 是浏览器的同源策略,小程序宿主是微信客户端,不走这一套。所以别在接口服务端折腾什么 CORS 头,也别试图用 JSONP——都不需要。
② 开发者工具能跑 ≠ 能上线。
最危险的场景是:勾了「不校验合法域名」后一切正常,以为稳了,结果体验版一打开就报错。记住那个开关只影响开发工具,上线前一定要把域名配到后台,并用真机预览验证一遍。
③ 域名一个月只能改 5 次。
正式发布前把所有要用的域名一次配齐(request / uploadFile / downloadFile / socket 是分开的四项,按需分别配)。改错了又用完当月次数,就只能等下个月——这个坑有人在提交审核前一天踩过。
结尾
接口文档(含全部字段说明和示例):
- 词海集(成语 / 诗词):https://www.hdemba.cn/api/
- 句悦集(每日一言 / 名言):https://www.shop186.com/api/
这两家接口免费开放,唯一的条件是返回里的来源字段要保留,也就是页面上留一行"数据来源"——顺手的事,也是接口能一直免费下去的原因。
如果想把同样的东西加到 Web 博客上,可以看前面几篇:
- 《给博客加一个"每日成语"模块,只要 10 行代码》
- 《用免费的随机诗词 API 做一个签名档》