BulkSMS API问题:无限制按时间范围获取已发送消息的URI格式
我之前也碰到过类似的API参数格式坑,尤其是这种文档写得半遮半掩的情况,太闹心了!结合你说的情况——能拿到正确格式的数据但量不够,说明你的请求链路是通的,但时间范围参数的传递或者API的隐性分页规则没踩对,咱们一步步捋:
先抠时间参数的格式细节
BulkSMS的API对时间格式要求大概率很严格,比如必须是UTC时区的ISO 8601格式(YYYY-MM-DDTHH:mm:ssZ),如果你传的是本地时间或者不带时区的字符串,可能只会匹配到部分数据。试试把起始时间转成标准UTC格式再拼到URI里,记得用encodeURIComponent()编码避免解析异常:const startTime = new Date('2024-01-01').toISOString(); // 输出类似"2024-01-01T00:00:00.000Z"排查API的隐性分页限制
几乎所有短信类API都会默认分页返回数据,比如每页只给100条,哪怕你没传分页参数。你可以试试在URI里加分页参数(比如page和pageSize,或者limit/offset,具体看文档里的参数名),然后循环请求所有页,把数据拼起来。这是最容易被忽略的点!换个方式传时间操作符
直接在URI里传>=或>这类特殊字符,哪怕编码了,有些API也可能识别有问题。试试用文本标识替代,比如用operator=gte代替>=,operator=gt代替>——很多API会这么设计,但文档可能没明确写出来,得靠试!验证请求URI的编码完整性
时间参数里的T、Z或者特殊字符如果没正确编码,可能会导致API解析错误,只返回部分数据。一定要确保所有动态参数都用encodeURIComponent()处理后再拼到URI里,避免出现截断或解析异常。
举个修正后的代码示例(假设你的原代码是类似这样)
原错误代码(可能的问题:时间格式不对、没分页、操作符直接传特殊字符):
async function getMessages() { const startTime = '2024-01-01 00:00:00'; const uri = `https://api.bulksms.com/messages?startTime=${startTime}&operator=>=`; const res = await fetch(uri, { headers: { 'Authorization': 'Basic ' + btoa('USER:PASS') } }); const data = await res.json(); console.log(data); }
修正后的代码:
async function getAllMessages() { const startTime = new Date('2024-01-01').toISOString(); // 转成UTC标准格式 const operator = 'gte'; // 用文本标识替代>= let allMessages = []; let page = 1; const pageSize = 500; // 尽量设大一点,减少请求次数 while (true) { // 所有动态参数都做编码处理 const uri = `https://api.bulksms.com/messages?startTime=${encodeURIComponent(startTime)}&operator=${operator}&page=${page}&pageSize=${pageSize}`; const res = await fetch(uri, { headers: { 'Authorization': 'Basic ' + btoa('USER:PASS'), 'Content-Type': 'application/json' } }); if (!res.ok) { console.error(`请求失败,状态码: ${res.status}`); break; } const data = await res.json(); if (data.length === 0) break; // 没有更多数据就终止循环 allMessages = [...allMessages, ...data]; page++; } console.log(`共获取到${allMessages.length}条符合条件的消息`); return allMessages; }
你可以先从调整时间格式和操作符开始试,如果还是不行,就加上分页逻辑,应该能解决数据量不足的问题!
内容的提问来源于stack exchange,提问作者user1796185

