news 2026/9/24 11:34:55

微信小程序接入免费成语诗词API

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
微信小程序接入免费成语诗词API

微信小程序报"不在 request 合法域名列表中":配置步骤 + 免费成语/诗词 API 实战

给小程序加一个"每日一句"或"每日成语"卡片,功能上很简单,难的是那一堆平台限制。
这篇把域名配置一次讲清,然后给你一套能直接跑的完整代码。

先看这个报错

request:fail url not in domain list

或者在控制台看到更完整的一句:

不在以下 request 合法域名列表中,请参考文档:https://developers.weixin.qq.com/…

十个小程序开发者九个撞过这个错。原因一句话:微信不允许小程序随便请求一个地址,你调用的接口域名必须先在小程序后台登记。

小程序网络请求的四条硬规矩

#要求说明
1必须 HTTPShttp://直接拦截,没有商量
2域名必须 ICP 备案这是最容易忽略的一条,也是大多数人接第三方接口失败的原因
3不能用 IP 地址或 localhost哪怕加了 https 也不行
4域名必须在小程序后台登记登记路径见下文

第 2 条是关键。网上大量免费接口要么是 http、要么是 IP 直连、要么域名没备案——这三类在小程序里全都用不了,不是你代码写错了。

选接口时先做三个检查:curl -I看是不是 https、ping 一下是不是 IP、去工信部备案查询确认域名有备案号。三个都过,才值得往下写代码。

配置步骤

登录 微信公众平台 →开发开发管理开发设置→ 往下找服务器域名→ 点「修改」→ 在request 合法域名里填上接口域名。

以我要用的接口为例,填:

https://www.hdemba.cn https://www.shop186.com

三个必须注意的点:

  1. 只填域名,不填路径。填https://www.hdemba.cn,不是https://www.hdemba.cn/api/daily。填完后,wx.request的 url 必须以这个域名开头,带不带www也要和后台完全一致。
  2. 服务器域名每月最多只能修改 5 次。别边想边填,先想清楚要把哪些域名加进来,一次配齐。
  3. 配置保存后等几分钟才会全网生效,立刻测试还是报错不用慌。

另外,开发阶段可以在微信开发者工具里临时跳过校验:详情 → 本地设置 → 勾选「不校验合法域名、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 做一个签名档》
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/24 11:33:11

ESP8266+KiwisIoT车库监测系统实战:从硬件选型到云端可视化

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/24 11:30:20

UE性能优化:GPU堆栈穿透与Texture Group分析实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/24 11:25:27

【Springboot毕设全套源码+文档】基于Java+spring boot的企业人事管理系统设计与实现(丰富项目+远程调试+讲解+定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/9/24 11:21:00

STM32F103C8T6 寄存器流水灯实验报告

芯片&#xff1a;STM32F103C8T6 功能&#xff1a;GPIOA、GPIOB、GPIOC 三端口&#xff0c;4 个 LED&#xff08;3 个外接 LEDPC13 板载 LED&#xff09;轮流流水&#xff0c;间隔 1s&#xff0c;寄存器直接编程 一、实验目的 熟悉 STM32 GPIO 寄存器工作原理&#xff0c;掌握寄…

作者头像 李华