事件消息通知协议
网络协议
- 请求:HTTP POST 请求,包体内容为 JSON,每一种消息的具体包体内容参见后文。
- 应答:HTTP STATUS CODE = 200,服务端忽略应答包具体内容,为了协议友好,建议客户应答内容携带 JSON:
{"code":0}
通知可靠性
事件通知服务具备重试能力,重试间隔为60秒,总计重试3次。为了避免重试对您的服务器以及网络带宽造成冲击,请保持正常回包。触发重试条件如下:
- 长时间(20 秒)未回包应答。
- 应答 HTTP STATUS 不为200。
@PostMapping("/receive")
public ResponseEntity<Map<String, Integer>> receive(@RequestBody Map<String, Object> mediaMap) {
// 应答:HTTP STATUS CODE = 200,服务端忽略应答包具体内容,为了协议友好,建议应答内容携带 JSON: {"code":0} 通知可靠性
Map<String, Integer> responseMap = new HashMap<>(16);
responseMap.put("code", 0);
String eventType = mediaMap.get("event_type").toString();
// 如果非录制文件消息就不处理
if (!MEDIA_TYPE.equals(eventType)) {
return new ResponseEntity<Map<String, Integer>>(responseMap, HttpStatus.OK);
}
String timetableId = mediaMap.get("stream_id").toString();
String fileId = mediaMap.get("file_id").toString();
if (timetableId.lastIndexOf(IGNORE_MEDIA_TYPE) != -1) {
this.deleteMedia(fileId);
return new ResponseEntity<>(responseMap, HttpStatus.OK);
}
String videoUrl = mediaMap.get("video_url").toString();
String streamParam = mediaMap.get("stream_param").toString();
String fileSize = mediaMap.get("file_size").toString();
String fileFormat = mediaMap.get("file_format").toString();
String startTime = mediaMap.get("start_time").toString();
String endTime = mediaMap.get("end_time").toString();
String[] paramsArray = streamParam.split("&");
Map<String, String> map = new HashMap<>(paramsArray.length);
for (String params : paramsArray) {
String[] param = params.split("=");
map.put(param[0], param[1]);
}
String roomId = map.get("groupid");
String userIdBase64 = map.get("userid");
Base64.Decoder decoder = Base64.getDecoder();
String lecturerId = null;
try {
lecturerId = new String(decoder.decode(userIdBase64), "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return new ResponseEntity<>(responseMap, HttpStatus.OK);
}