微信小程序云开发httpApi调用
前言
准备工作
要在服务器环境中调用云开发的官方api,首先要根据你的小程序获取调用token:
ownTool.netModel就是任意具有http接口调用功能的第三方库, 这里使用get方法发起请求,请求参数中的appId和secret都可以在小程序的开发者后台中产看。 这里获取的token是我们后续调用官方api的必要条件。
调用官方api
假设这里有如下格式的数据: 这里首先给出一个api调用的例子:
这里的环境id就是你的小程序官方编辑器点击云开发摁钮,在云开发面板中查询的: 这里要注意,通过http api查询时,要把所有的查询语句转化成字符串的形式,最后把这个字符串作为请求参数传递给官方api。
通过http api调用官方接口的核心点和易错点就在这个query语句上,如果要表示字符串值,一定要用"“或’对字段包裹,如果要让官方api理解为一个变量,则一定不能用”"或’包裹。这里是绝大多数初学者在通过http调用api时翻车的原因
这里笔者的查询语句功能是:在period集合中,查找counselorId为某个特定值的数据,跳过一开始的offset个数据,该次请求最多返回size个,返回数据根据data字段进行降序排序后返回。如果在小程序中,查询语句类似这样:
db.collection(period).where({ counselorId: 匹配的id }).skip(offset).limit(size) .get({ success: function(res) { console.log(res.data) } })
如果功能在复杂一点,比如说我们要求date字段要在某个区间内的数据才返回,在小程序或云函数中我们的请求这样写:
const _ = db.command db.collection(period).where({ data: _.gt(2020-03-20).and(_.lt(2020-04-20)) }) .get({ success: function(res) { console.log(res.data) } })
在自己的服务器中我们的查询字符串需要这样写:
let a = await ownTool.netModel.post(doamin, { env: 你的环境id, query: db.collection("period").where({date: _.gt("2020-03-20").and(_.lt("2020-04-20"))}).get() })
在官方解析我们的query时,会自动把_理解为db.command的实例,我们直接在query字符串中使用即可。在真实的项目中,我们用手写查询语句显得比较笨重,可以通过对查询对象直接JSON.stringfy()的方法将其转化为字符串拼接到query字符串中。这里笔者贴下自己在项目中的示例代码给大家参考,细节就不解释了,大家主要可以参考下将查询对象转化为string的操作:
function getQueryString(pageNum: number) { const queryJsonString = JSON.stringify( Object.assign( { }, queryObj.switchOn ? { formData.date: `_.gt(${ queryObj.period?.[0]?.format(YYYY-MM-DD, )}).and(_.lt(${ queryObj.period?.[1]?.format(YYYY-MM-DD)}))`, } : { }, queryObj.counselorId ? { counselorId: `${ queryObj.counselorId}` } : { }, ), ) // 这里要替换下,否则后台会理解为字符串而不是查询条件 .replace(/"/g, ) // 嵌套对象必须要套引号,否则无法解析 .replace(formData.date, "formData.date"); return `db.collection(interviewee).where(${ queryJsonString}).skip(${ (pageNum - 1) * SINGLE_PAGE_SIZE}).limit(${ SINGLE_PAGE_SIZE}).orderBy(date,desc).get()`; }