使用onesignal-java-api发送带Tag通知报错,Rest方式可正常运行
解决OneSignal Java API客户端Tag推送400错误问题
问题说明
用Postman调用OneSignal REST API能正常实现基于Tag的消息推送,但用官方Java API客户端编写代码时,收到400错误:
HTTP响应码:400
HTTP响应体:{"errors":["你必须指定要接收此通知的用户、细分群体或标签。"]}
Postman请求里的核心筛选逻辑是:
"filters": [{"field": "tag", "key": "email", "relation": "=", "value": "AAAAA@AAAAA.com"}]
但你写的Java代码错误使用了setTag()方法传递标签条件,导致API无法识别推送目标。
错误原因
你代码里的notification.setTag(contents.get("tags"))是错的:
setTag()对应OneSignal API里的单个tag参数,不是用于指定接收者的filters数组- 正确做法是用
setFilters()方法,构造符合要求的过滤器列表来指定推送范围
正确代码示例
import com.onesignal.model.notification.Filter; import com.onesignal.model.notification.Notification; import com.onesignal.model.notification.StringMap; import java.util.ArrayList; import java.util.List; // 构造多语言内容 StringMap contentStringMap = new StringMap(); contentStringMap.setEn("this is the value of contents"); // 构造标签筛选规则 Filter tagFilter = new Filter(); tagFilter.setField("tag"); tagFilter.setKey("email"); tagFilter.setRelation("="); tagFilter.setValue("AAAAAA@AAAAA.com"); List<Filter> filters = new ArrayList<>(); filters.add(tagFilter); // 组装通知对象 Notification notification = new Notification(); notification.setAppId(APP_KEY); notification.setIsChrome(true); notification.setIsAnyWeb(true); notification.setContents(contentStringMap); // 用setFilters传递筛选规则,替代错误的setTag notification.setFilters(filters); // 可选:补充Postman里的其他参数 notification.setName("INTERNAL_CAMPAIGN_NAME"); notification.setChannelForExternalUserIds("push");
核心要点
- 用
Filter类构造单个标签筛选条件,再加入List<Filter>集合 - 通过
notification.setFilters(filters)传递筛选规则,对应Postman请求里的filters数组 - 确保参数和Postman请求保持一致,避免遗漏必要字段引发其他错误
内容的提问来源于stack exchange,提问作者qleoz12
相关产品推荐
相关产品推荐

