Zapier 中的 JavaScript 使用分页循环 API 调用
Posted
技术标签:
【中文标题】Zapier 中的 JavaScript 使用分页循环 API 调用【英文标题】:JavaScript in Zapier to loop API calls using pagination 【发布时间】:2020-04-03 17:34:33 【问题描述】:我在 Zapier 中有一个 GET 请求,使用此 API 从预订系统 MindBody 获取瑜伽课程列表; https://developers.mindbodyonline.com/PublicDocumentation/V6#get-classes
Zapier 确实具有自动获取“所有”结果的功能,即使最大限制为 200,Zap 也需要获取下一页结果。默认情况下,我可以获得 200 个结果的限制,偏移量为 0。
我需要 Zapier 获取前 200 个,将偏移量增加 200,得到 200-400 个结果,依此类推。最终结果可能是 650 个结果全部组合在 Zap 中,然后我可以在另一个任务中使用(计数、求和、查找等)
如何使用 Zapier Code 任务使用这些参数逐步循环/获取 JSON 列表中的所有项目:
响应正文中返回的分页信息示例:
https://developers.mindbodyonline.com/PublicDocumentation/V6#pagination
“分页响应”: “请求限制”:10, “RequestedOffset”:20, “页面大小”:10, “总成绩”:128 , “类”:[ . . . ]
今天在 Zapier 中的示例 GET 和响应;
输入样本数据(获取请求)
json_key:访问次数 展开:是的 标题: 内容类型:应用程序/json 站点编号:xxx API 密钥:xxx 姓名:xxx 网址:https://api.mindbodyonline.com/public/v6/client/clientvisits 数据: 限制:200 开始日期:2015-01-01T00:00:00 结束日期:2099-01-01T00:00:00 客户编号:xxx 偏移量:0 as_json:没有
返回的样本数据
访问: 1: 类 ID:xxx LastModifiedDateTime:0001-01-01T00:00:00Z 化妆:假 约会ID:0 服务名称: 预约性别偏好:无 结束日期时间:2019-12-11T08:15:00 客户编号:xxx 延迟取消:假 行动:无 服务编号: 站点编号:xxx 登录:真 开始日期时间:2019-12-11T07:15:00 员工编号:x 位置编号:x 网络注册:假 产品编号: 预约状态:无 编号:xxx 姓名:xxx 2: 类 ID:xxx LastModifiedDateTime:0001-01-01T00:00:00Z 化妆:假 约会ID:0 服务名称: 预约性别偏好:无 结束时间:2019-12-11T09:30:00 客户编号:xxx 延迟取消:假 行动:无 服务编号: 站点编号:xxx 登录:真 开始日期时间:2019-12-11T08:30:00 员工编号:xxx 位置编号:xx 网络注册:假 产品编号: 预约状态:无 编号:xxx 姓名:xxx
分页响应: 总结果:2 页面大小:2 请求偏移量:0 请求限制:
2019 年 12 月 19 日更新: 1) 呼叫端点; https://api.mindbodyonline.com/public/v6/client/clientvisits 带有查询参数; 开始日期:2015-01-01T00:00:00 结束日期:2099-01-01T00:00:00 偏移量:0 客户编号:XXX 限制:200 标头; 姓名:xxx 站点编号:xxx API 密钥:xxx 内容类型:application/json
Postman 中的示例响应: “分页响应”: “请求限制”:200, “请求偏移量”:0, “页面大小”:2, “总结果”:2 , “访问”:[ “约会ID”:0, "AppointmentGenderPreference": "无", “约会状态”:“无”, “ClassId”:xxx, “客户 ID”:“xxx”, "开始日期时间": "2019-04-27T09:45:00", "EndDateTime": "2019-04-27T10:45:00", “身份证”:xxx, "LastModifiedDateTime": "0001-01-01T00:00:00Z", “延迟取消”:假, “位置标识”:1, “化妆”:假, “名称”:“瑜伽巴雷”, “服务标识”:空, “登录”:是的, “员工编号”:xxx, “网络注册”:假, “行动”:“无” , “约会ID”:0, "AppointmentGenderPreference": "无", “约会状态”:“无”, “ClassId”:xxx, “客户 ID”:“xxx”, "开始日期时间": "2019-07-19T16:45:00", "EndDateTime": "2019-07-19T17:45:00", “身份证”:273726, "LastModifiedDateTime": "0001-01-01T00:00:00Z", “延迟取消”:假, “位置标识”:1, “化妆”:假, “名称”:“冥想”, “服务标识”:空, “登录”:是的, “员工编号”:xxx, “网络注册”:假, “行动”:“无” ]
如果 TotalResults = 201 或更多,则请求的偏移量应设置为 200 并再次循环,依此类推。我在响应中需要的唯一数据是“SignedIn”,如果所有 ClientVisits 都收集在一起,我可以在以后的步骤中计算或求和。希望这是有道理的!
【问题讨论】:
您是在 Developer 中执行此操作,还是通过 Zapier 的 Zap with Code 执行此操作? 代码。开发人员有分页,但根据 Zapier 支持,分页是用户必须手动调用的功能。听起来像代码,作为 Zap 中的一项任务,需要增加/循环分页请求。感谢您的帮助! 好的,所以我认为我们需要知道的内容如下。 1- 每个 Zap 步骤名称按顺序和其中的重要数据变量(图片可能更好)。 2 - 分页后数据的去向(第一个问题可能会回答这个问题)。即使您正确编码,某些 zaps 也不支持分页。 3 - 您目前拥有的 API 代码(使用虚拟名称作为令牌等私有信息)。 谢谢!这是 Zap 现在发生的事情并且有效。我将 'SignedIn:True' 算作最终结果。 我用示例 GET 和响应更新了问题。示例数据正在返回一个包含 2 个类及其属性的列表。您将在最后看到分页响应。如果 TOTALRESULTS 大于 200,则 GET 需要再次使用 OFFSET:200 来获得 200-400 的结果。 【参考方案1】:我建议使用 Zapier 提供的 Python 代码模块来实现这一点。从您目前所描述的情况来看,您似乎正在使用 webhooks zap,这对于快速发出 HTTP 请求非常有用,但可能缺乏微调方面。
我不确定你想使用什么触发器来执行这个 zap 流,所以我假设你希望它在每天的特定时间发生一次。所以我们使用调度器 zap 作为触发器。操作步骤将由 Zapier 使用 Python 模块编写代码。请看下面的代码:
import requests
def send_request(url):
headers =
"Api-Key" : "yourApiKey",
"SiteId" : "yourSiteID",
"Authorization" : "staffUserToken"
result = requests.get(url, headers=headers)
return result
def main():
offset = 0
limit = 50
total_results = 0
class_data = []
while True:
result = send_request(f"api.mindbodyonline.com/public/v6/ckass/classes?limit=limit&offset=offset")
if not result.ok: # Bad request
break
result = result.json()
if not total_results:
total_results = result.get('PaginationResponse', ).get('TotalResults', 0)
if offset >= total_results: # We have exceeded the total number of results available
break
temp_class_data = result.get('Classes')
for data in temp_class_data:
class_data.append(
"ClassScheduleID" : data.get("ClassScheduleID"),
"Clients" : data.get("Clients"),
"MaxCapacity" : data.get("MaxCapacity"),
"TotalBooked" : data.get("TotalBooked")
)
offset += limit
return class_data
return main()
使用 Python 的 requests 库,您可以制定自己的 HTTP 请求。我们可以使用 while 循环对结果进行分页以增加我们的偏移量变量。我不使用此服务,因此我选择了一些任意数据点来返回您下一步想要使用的任何步骤。使用上面的代码,我将返回一个字典对象列表。因此,任何后续操作步骤都将对每个唯一结果执行。因此,如果在运行上述代码后,我的 class_data
列表包含 3 个单独的结果,则以下操作步骤将分别在每个步骤上执行。
希望这会有所帮助。我对你想要达到的目标做了一些假设。如果有任何不清楚的地方或您有任何其他问题,请告诉我。
【讨论】:
1) 使用查询参数调用端点api.mindbodyonline.com/public/v6/client/clientvisits 我想我无法将屏幕截图放入这些 cmets,所以我更新了这个问题。请参阅“UPDATE 12/19/2019:”以及端点、参数和示例 Postman 响应。谢谢!以上是关于Zapier 中的 JavaScript 使用分页循环 API 调用的主要内容,如果未能解决你的问题,请参考以下文章
Zapier (JavaScript) 的代码中的 getHours() 和 getUTCHours
Zapier:E164 GB/UK 手机号码解析,可以使用 Python/Javascript 完成吗?