添加WVP调用的SDK

This commit is contained in:
孙小云 2025-12-10 15:05:48 +08:00
parent b9606f297b
commit 4325f1cf1d
2 changed files with 462 additions and 0 deletions

View File

@ -1,4 +1,177 @@
package com.tuoheng;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.time.Duration;
import java.util.HashMap;
import java.util.Map;
/**
* WVP 视频平台客户端
* 用于调用 WVP 后端服务的 API
*/
public class WvpClient {
public static void main(String[] args) throws Exception {
WvpTokenClient.LoginResponse loginResponse = WvpTokenClient.login("admin", "admin");
System.out.println("登录响应结果:");
System.out.println(loginResponse);
System.out.println("\nAccess Token: " + loginResponse.getData().getAccessToken());
WvpClient client = new WvpClient("http://114.67.89.4:9090",loginResponse.getData().getAccessToken());
JsonNode result = client.getPushList();
}
private final String wvpBaseUrl;
private final String accessToken;
private final HttpClient httpClient;
private final ObjectMapper objectMapper;
/**
* 构造函数
*
* @param wvpBaseUrl WVP 服务器地址例如: http://114.67.89.4:9090
* @param accessToken WVP 访问令牌
*/
public WvpClient(String wvpBaseUrl, String accessToken) {
this.wvpBaseUrl = wvpBaseUrl;
this.accessToken = accessToken;
this.httpClient = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(10))
.build();
this.objectMapper = new ObjectMapper();
}
/**
* 获取推流列表
*
* @param page 当前页默认 1
* @param count 每页数量默认 10
* @param query 查询内容可选
* @param pushing 是否只显示正在推流的默认 true
* @param mediaServerId 流媒体服务器ID可选
* @return 推流列表的 JSON 响应
* @throws Exception 请求失败时抛出异常
*/
public JsonNode getPushList(int page, int count, String query, Boolean pushing, String mediaServerId) throws Exception {
// 构建查询参数
Map<String, String> params = new HashMap<>();
params.put("page", String.valueOf(page));
params.put("count", String.valueOf(count));
if (query != null && !query.isEmpty()) {
params.put("query", query);
}
if (pushing != null) {
params.put("pushing", pushing.toString());
}
if (mediaServerId != null && !mediaServerId.isEmpty()) {
params.put("mediaServerId", mediaServerId);
}
// 构建 URL
String url = buildUrl("/api/push/list", params);
// 发送 GET 请求
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(url))
.header("access-token", accessToken)
.header("Content-Type", "application/json")
.GET()
.timeout(Duration.ofSeconds(30))
.build();
HttpResponse<String> response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());
// 检查响应状态
if (response.statusCode() != 200) {
throw new RuntimeException("获取推流列表失败,状态码: " + response.statusCode() + ", 响应: " + response.body());
}
// 解析 JSON 响应
return objectMapper.readTree(response.body());
}
/**
* 获取推流列表使用默认参数
*
* @return 推流列表的 JSON 响应
* @throws Exception 请求失败时抛出异常
*/
public JsonNode getPushList() throws Exception {
return getPushList(1, 10, null, true, null);
}
/**
* 获取播放地址
*
* @param id 推流ID从推流列表中获取
* @return 播放地址的 JSON 响应包含 FLVHLSWebRTCRTMPRTSP 等多种格式的播放地址
* @throws Exception 请求失败时抛出异常
*/
public JsonNode getPushStart(int id) throws Exception {
// 构建查询参数
Map<String, String> params = new HashMap<>();
params.put("id", String.valueOf(id));
// 构建 URL
String url = buildUrl("/api/push/start", params);
// 发送 GET 请求
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(url))
.header("access-token", accessToken)
.header("Content-Type", "application/json")
.GET()
.timeout(Duration.ofSeconds(30))
.build();
HttpResponse<String> response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());
// 检查响应状态
if (response.statusCode() != 200) {
throw new RuntimeException("获取播放地址失败,状态码: " + response.statusCode() + ", 响应: " + response.body());
}
// 解析 JSON 响应
return objectMapper.readTree(response.body());
}
/**
* 构建带查询参数的 URL
*
* @param path API 路径
* @param params 查询参数
* @return 完整的 URL
*/
private String buildUrl(String path, Map<String, String> params) {
StringBuilder url = new StringBuilder(wvpBaseUrl);
url.append(path);
if (params != null && !params.isEmpty()) {
url.append("?");
params.forEach((key, value) -> {
url.append(key).append("=").append(value).append("&");
});
// 移除最后一个 &
url.setLength(url.length() - 1);
}
return url.toString();
}
/**
* 关闭 HTTP 客户端如果需要
*/
public void close() {
// HttpClient 会自动管理连接池通常不需要手动关闭
}
}

View File

@ -0,0 +1,289 @@
package com.tuoheng;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import com.google.gson.Gson;
public class WvpTokenClient {
private static final String WVP_BASE_URL = "http://114.67.89.4:9090";
private static final Gson gson = new Gson();
/**
* WVP登录响应对象
*/
public static class LoginResponse {
private int code;
private String msg;
private LoginData data;
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public LoginData getData() {
return data;
}
public void setData(LoginData data) {
this.data = data;
}
@Override
public String toString() {
return gson.toJson(this);
}
}
/**
* 登录数据对象
*/
public static class LoginData {
private String accessToken;
private String serverId;
private int id;
private boolean enabled;
private String password;
private Role role;
private String username;
private String pushKey;
private boolean accountNonExpired;
private boolean accountNonLocked;
private boolean credentialsNonExpired;
public String getAccessToken() {
return accessToken;
}
public void setAccessToken(String accessToken) {
this.accessToken = accessToken;
}
public String getServerId() {
return serverId;
}
public void setServerId(String serverId) {
this.serverId = serverId;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public boolean isEnabled() {
return enabled;
}
public void setEnabled(boolean enabled) {
this.enabled = enabled;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Role getRole() {
return role;
}
public void setRole(Role role) {
this.role = role;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPushKey() {
return pushKey;
}
public void setPushKey(String pushKey) {
this.pushKey = pushKey;
}
public boolean isAccountNonExpired() {
return accountNonExpired;
}
public void setAccountNonExpired(boolean accountNonExpired) {
this.accountNonExpired = accountNonExpired;
}
public boolean isAccountNonLocked() {
return accountNonLocked;
}
public void setAccountNonLocked(boolean accountNonLocked) {
this.accountNonLocked = accountNonLocked;
}
public boolean isCredentialsNonExpired() {
return credentialsNonExpired;
}
public void setCredentialsNonExpired(boolean credentialsNonExpired) {
this.credentialsNonExpired = credentialsNonExpired;
}
}
/**
* 角色对象
*/
public static class Role {
private int id;
private String name;
private String authority;
private String createTime;
private String updateTime;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAuthority() {
return authority;
}
public void setAuthority(String authority) {
this.authority = authority;
}
public String getCreateTime() {
return createTime;
}
public void setCreateTime(String createTime) {
this.createTime = createTime;
}
public String getUpdateTime() {
return updateTime;
}
public void setUpdateTime(String updateTime) {
this.updateTime = updateTime;
}
}
/**
* 计算MD5哈希值
*
* @param input 输入字符串
* @return MD5哈希值小写
* @throws Exception 如果计算失败
*/
private static String md5(String input) throws Exception {
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] messageDigest = md.digest(input.getBytes(StandardCharsets.UTF_8));
StringBuilder hexString = new StringBuilder();
for (byte b : messageDigest) {
String hex = Integer.toHexString(0xff & b);
if (hex.length() == 1) {
hexString.append('0');
}
hexString.append(hex);
}
return hexString.toString();
}
/**
* WVP用户登录
*
* @param username 用户名
* @param password 密码明文
* @return 登录响应对象
* @throws Exception 如果请求失败
*/
public static LoginResponse login(String username, String password) throws Exception {
// 计算密码的MD5值
String passwordMd5 = md5(password);
// 构建 URL 参数
StringBuilder urlBuilder = new StringBuilder(WVP_BASE_URL);
urlBuilder.append("/api/user/login?");
urlBuilder.append("username=").append(URLEncoder.encode(username, StandardCharsets.UTF_8.name()));
urlBuilder.append("&password=").append(passwordMd5);
// 创建 HTTP 连接
URL url = new URL(urlBuilder.toString());
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setConnectTimeout(10000);
connection.setReadTimeout(10000);
// 获取响应
int responseCode = connection.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) {
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8));
StringBuilder response = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
response.append(line);
}
reader.close();
// 解析JSON响应
return gson.fromJson(response.toString(), LoginResponse.class);
} else {
throw new Exception("HTTP 请求失败,状态码: " + responseCode);
}
}
public static void main(String[] args) {
try {
// 调用 login 方法
LoginResponse loginResponse = login("admin", "admin");
System.out.println("登录响应结果:");
System.out.println(loginResponse);
System.out.println("\nAccess Token: " + loginResponse.getData().getAccessToken());
System.out.println("Username: " + loginResponse.getData().getUsername());
System.out.println("Role: " + loginResponse.getData().getRole().getName());
} catch (Exception e) {
System.err.println("登录失败: " + e.getMessage());
e.printStackTrace();
}
}
}