一封传话聚合推送各语言demo代码示例

55 阅读3分钟

一封传话聚合推送各语言demo代码示例

前言

查看一封传话的API文档的GET请求只需一行代码,在url上拼接head和body参数即可完成推送。这里针对body数据量较大的情况,给出各语言实现的demo代码。

Tips:以下代码中的trigger与API文档中的send等价,trigger在send基础上做了高级特性增强处理,可以参考:一封传话聚合推送高级特性API 任何使用者都可以随意选择调用任何一个API,在API的使用方式上没有差异。

PHP语言

<?php
// 通道码/口令码
$channel_code = "4d2dac865118761a14d10d7d3afe7c35";
$head = "测试标题";
$body = "测试内容";
$postdata = json_encode(
    array(
        'head' => $head,
        'body' => $body
        )
    );

$opts = array('http' =>
    array(
        'method'  => 'POST',
        'header'  => 'Content-type: application/json',
        'content' => $postdata
        )
    );
$context  = stream_context_create($opts);
$api_url = 'https://www.phprm.com/services/push/trigger/'.$channel_code;
$result = file_get_contents($api_url, false, $context);
echo $result;

如果你更倾向于使用curl库, 完全可以自己实现或者参考以下开源的三方库里的curl代码。

一些开源的三方库

  1. 如果希望使用专业推送库, 可以参考此开源项目, 【一封传话】聚合推送SDK已经提交到Github和Gitee,通过composer可以直接安装SDK:
  1. 提供博客系统新注册用户、新评论提醒插件, 可以参考插件源码或者直接在自己的网站使用:

JAVA语言

建议使用Guava自带限流工具类, 例如10秒告警一次防止大量请求消耗你自己的服务器,如果使用redis分布式限流更好,这里还用到了Hutool工具包下的http请求类。

Hutool官网说明文档: hutool.cn/docs/#/ 最新maven如下

<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.8.11</version>
</dependency>

java告警工具类demo:


import com.alibaba.fastjson2.JSONObject;
import com.google.common.util.concurrent.RateLimiter;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;

/**
 * Java系统告警工具类
 */
public class SystemAlarmUtil {

	private final static RateLimiter rateLimiter = RateLimiter.create(1d);

	private SystemAlarmUtil() {
		super();
	}

	public static String sendAlarmMessage(String title, String message) {
		try {
			// count 每次消耗的令牌10个, 那么每10秒才会通过一次 timeout 超时等待的时间, 等待超过1秒就拒绝发送
			if (!rateLimiter.tryAcquire(10, 1, TimeUnit.SECONDS)) {
				return null;
			}

			// 创建json对象作为requestBody
			JSONObject jsonObject = new JSONObject();
			jsonObject.put("head", title);
			jsonObject.put("body", message);
			// 添加请求头信息
			Map<String, String> heads = new HashMap<>();
			// 使用json发送请求,下面的是必须的
			heads.put("Content-Type", "application/json;charset=UTF-8");
			HttpResponse response = HttpRequest.post("https://www.phprm.com/services/push/trigger/4d2dac865118761a14d10d7d3afe7c35")
					.headerMap(heads, false).body(String.valueOf(jsonObject)).timeout(5 * 1000).execute();
			System.out.println("告警推送结果: "+response.body());
			return response.body();
		}
		catch (Exception exception) {

		}
		return null;
	}

	public static void main(String[] args) {
		SystemAlarmUtil.sendAlarmMessage("系统故障告警", "故障模块: 订单模块\n订单ID=xxxx\n订单金额: 100元\n故障原因: xxxx");
	}
}

由于java生态比较丰富,而且几乎所有人都有自己实现POST请求的工具类,这么就不提供SDK了。

Python语言

Python语言环境使用demo:

#coding:utf-8
import requests
import json
# 通道码/口令码
channel_code = '4d2dac865118761a14d10d7d3afe7c35'
head = '测试标题'
body = '测试内容'
headers={
'Content-Type': 'application/json'
}
url='https://www.phprm.com/services/push/send/'+channel_code
data={'head':head,'body':body}
res=requests.post(headers=headers,url=url,data=json.dumps(data),timeout=10)
print(json.dumps(res))

Go语言

Golang语言环境使用demo:

package main

import (
	"bytes"
	"encoding/json"
	"fmt"
	"io/ioutil"
	"net/http"
	"unsafe"
)

func SendMessage() error {
	channelCode := "4d2dac865118761a14d10d7d3afe7c35"
	message1 := make(map[string]interface{})
	message1["head"] = "测试标题"
	message1["body"] = "测试内容"
	bytesData, err := json.Marshal(message1)
	if err != nil {
		fmt.Println(err.Error() )
		return nil
	}
	reader := bytes.NewReader(bytesData)
	url := fmt.Sprintf("https://www.phprm.com/services/push/send/%s", channelCode)
	request, err := http.NewRequest("POST", url, reader)
	if err != nil {
		fmt.Println(err.Error())
		return nil
	}
	request.Header.Set("Content-Type", "application/json;charset=UTF-8")
	client := http.Client{}
	resp, err := client.Do(request)
	if err != nil {
		fmt.Println(err.Error())
		return nil
	}
	respBytes, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		fmt.Println(err.Error())
		return nil
	}
	str := (*string)(unsafe.Pointer(&respBytes))
	fmt.Println(*str)
	return nil
}

func main() {
	SendMessage()
}

C#语言

笔者暂未安装C#运行环境所以这里只提供GET请求,不过相信对C#熟悉的同学编写POST application/json请求不是难事。

// Get请求
string url = "https://www.phprm.com/services/push/send/4d2dac865118761a14d10d7d3afe7c35?head="
	+ HttpUtility.UrlEncode("测试标题")
	+ "&body="
	+ HttpUtility.UrlEncode("测试内容" + DateTime.Now);
var response = await httpClient.GetAsync(url);
string res = await response.Content.ReadAsStringAsync();
Console.WriteLine("推送状态:" + response.StatusCode);
Console.WriteLine(res);

其他语言

敬请期待

参考:

www.phprm.com/push/h5/

push.phprm.com/doc/#/p/dem…

juejin.cn/post/719928…

juejin.cn/post/719927…

juejin.cn/post/719928…