Skip to content

TencentCloud/wemeet-restapi-sdk-java

Repository files navigation

简介

欢迎使用腾讯会议开发者工具套件(SDK)1.1.0,为方便 JAVA 开发者调试和接入腾讯云会议 API,这里向您介绍适用于 Java 的腾讯会议开发工具包,并提供首次使用开发工具包的简单示例。让您快速获取腾讯会议 Java SDK 并开始调用。

由于demo 代码不会跟随官网接口更新,需要用户使用源码下载到本地改造适配,以使用新接口功能。

通过源码包安装

  1. 前往 Github 代码托管地址 下载源码压缩包;
  2. 解压源码包到您项目合适的位置;
  3. 需要将vendor目录下的jar包放在java的可找到的路径中;
  4. 引用方法可参考示例。

示例

以创建会议接口为例:

package com.tencentcloudapi.wemeet;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.squareup.okhttp.Interceptor;
import com.squareup.okhttp.Response;
import com.tencentcloudapi.wemeet.client.MeetingClient;
import com.tencentcloudapi.wemeet.client.UserClient;
import com.tencentcloudapi.wemeet.common.RequestSender;
import com.tencentcloudapi.wemeet.common.constants.InstanceEnum;
import com.tencentcloudapi.wemeet.common.exception.WemeetSdkException;
import com.tencentcloudapi.wemeet.common.profile.HttpProfile;
import com.tencentcloudapi.wemeet.models.meeting.CreateMeetingRequest;
import com.tencentcloudapi.wemeet.models.meeting.QueryMeetingDetailResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * <p>会议请求</p>
 * 企业内部应用鉴权方式
 * 1.企业管理员登录腾讯会议官网(https://meeting.tencent.com/),
 * 单击右上角【用户中心】,在左侧菜单栏中的【企业管理】>【高级】>【restApi】中进行查看。
 * 2.支持两种方式实例化请求代理对象
 * 1)全局代理对象:设置全局HttpProfile,在项目启动时进行初始化,并构造RequestSender对象,所有客户端请求可共用一套配置;
 * 2)局部代理对象:也可以针对具体某个接口单独实例化HttpProfile,并通过此对象构造RequestSender对象
 * 3.构造具体client,参考client包,例如MeetingClient,通过构造方法传入RequestSender实例,初始化client
 * 4.通过client调用具体方法即可发起请求,
 * eg:QueryMeetingDetailResponse response = client.createMeeting(request);
 * <p>
 * 第三方应用鉴权(OAuth2.0)
 * 1.参考官网文档(https://cloud.tencent.com/document/product/1095/51257)获取AccessToken和OpenId
 * 2.参考【企业内部应用鉴权方式】第2步,初始化代理实例
 * 3.构造请求体,并添加第1部申请到的参数到请求Header中
 * eg:
 * CreateMeetingRequest request = new CreateMeetingRequest();
 * request.setUserId("test_user");
 * request.setInstanceId(InstanceEnum.INSTANCE_MAC.getInstanceID());
 * request.setSubject("sdk 创建会议");
 * request.setType(0);
 * request.setStartTime("1619733600");
 * request.setEndTime("1619737200");
 * // 设置Header
 * request.addHeader(ReqHeaderConstants.ACCESS_TOKEN, "111111");
 * request.addHeader(ReqHeaderConstants.OPEN_ID, "2222");
 * 4.通过client发起请求
 *
 * @author tencent
 * @date 2021/4/29
 */
public class MeetingRequest {
    private static final Log log = LogFactory.getLog(MeetingRequest.class);
    // 初始化全局client
    /**
     * 初始化全局会议client
     */
    private static final MeetingClient MEETING_CLIENT;
    /**
     * 初始化全局用户client
     */
    private static final UserClient USER_CLIENT;
    private static final Gson GSON = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();

     static {
         HttpProfile profile = new HttpProfile();
         // 腾讯会议分配给三方开发应用的 App ID。企业管理员可以登录 腾讯会议官网,单击右上角【用户中心】
         // 在左侧菜单栏中的【企业管理】>【高级】>【restApi】中进行查看。
         profile.setAppId("AppId");
         // 用户子账号或开发的应用 ID,企业管理员可以登录 腾讯会议官网,单击右上角【用户中心】
         // 在左侧菜单栏中的【企业管理】>【高级】>【restApi】中进行查看(如存在 SdkId 则必须填写,早期申请 API 且未分配 SdkId 的客户可不填写)。
         profile.setSdkId("SdkId");
         // 请求域名
         profile.setHost("https://api.meeting.qq.com");
         // 申请的安全凭证密钥对中的 SecretId,传入请求header,对应X-TC-Key
         profile.setSecretId("SecretId");
         // 申请的安全凭证密钥对中的 Secretkey,用户签名计算
         profile.setSecretKey("SecretKey");
         // 是否开启请求日志,开启后会打印请求和返回的详细日志
         profile.setDebug(true);
         // 设置请求超时时间,单位s
         profile.setReadTimeout(3);
         // 设置获取连接超时时间,单位s
         profile.setConnTimeout(1);
 
         // 初始化全局sender,也可以方法级别实例化
         RequestSender sender = new RequestSender(profile);
         // 自定义拦截器,可以忽略
         sender.addInterceptors(new Interceptor() {
             @Override
             public Response intercept(Chain chain) {
                 // TODO return null; 用户自定义实现
             }
         });
         // 实例化client
         MEETING_CLIENT = new MeetingClient(sender);
         USER_CLIENT = new UserClient(sender);
         // ...
     }
 
     public static void main(String[] args) throws WemeetSdkException {
         CreateMeetingRequest request = new CreateMeetingRequest();
         request.setUserId("test_user");
         request.setInstanceId(InstanceEnum.INSTANCE_MAC.getInstanceID());
         request.setSubject("sdk 创建会议");
         request.setType(0);
         // OAuth2.0鉴权方式,PROFILE对象不用设置sdkId、appId、secretID、secretKey
         // request.addHeader(ReqHeaderConstants.ACCESS_TOKEN, "111111");
         // request.addHeader(ReqHeaderConstants.OPEN_ID, "2222");
         request.setStartTime("1619733600");
         request.setEndTime("1619737200");
         // 非注册用户设置
         // request.addHeader(ReqHeaderConstants.REGISTERED, "0");
 
         QueryMeetingDetailResponse response = MEETING_CLIENT.createMeeting(request);
         log.info(GSON.toJson(response));
     }


}

更多示例

您可以在github中examples目录下找到更多详细的示例。

相关配置

支持打印日志

SDK 支持打印日志。 首先,在创建 HttpProfile 对象时,设置 debug 模式为真,会打印sdk异常信息和流量信息

      HttpProfile profilerofile = new HttpProfile();
      profilerofile.setDebug(true);

腾讯云java sdk 使用commons.logging类进行打印日志,如下所示。

四月 14, 2021 11:39:06 上午 RequestSender info
信息: send request, request url: https://api.meeting.qq.com/v1/meetings/1212425215?userid=test&instanceid=2. request headers information: X-TC-Key: 111111111*********;X-TC-Nonce: 953034268;X-TC-Registered: 1;AppId: 11111111;X-TC-Signature: ******;X-TC-Timestamp: 1111111111;SdkId: 124122;
四月 14, 2021 11:39:09 上午 RequestSender info
信息: recieve response, response url: https://api.meeting.qq.com/v1/meetings/1232421521?userid=test&instanceid=2, response headers: Date: Wed, 14 Apr 2021 03:39:09 GMT;Content-Type: application/json; charset=utf-8;Content-Length: 962;Connection: keep-alive;Server: nginx;X-Tc-Trace: 124215125151;Access-Control-Allow-Origin: *;OkHttp-Selected-Protocol: http/1.1;OkHttp-Sent-Millis: 1618371546860;OkHttp-Received-Millis: 1618371549096;,response body information: com.squareup.okhttp.internal.http.RealResponseBody@42ed8181
四月 14, 2021 11:39:09 上午 com.wemeet.restapi.service.impl.MeetingServiceImpl queryMeetingById

用户可以根据自己的需要配置日志打印类,如log4j 配置方法如下:

  • 配置pom文件,设置log4j版本。
    <dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
      <version>1.2.17</version>
    </dependency>
  • 设置环境变量为log4j, 并创建log类
System.setProperty("org.apache.commons.logging.Log", "org.apache.commons.logging.impl.Log4JLogger");
Log logger = LogFactory.getLog("TestLog");
logger.info("hello world");

注:近期log4j2被爆出JNDI注入漏洞,影响较大,详情可见https://cloud.tencent.com/announce/detail/1692 在使用腾讯会议SDK,如用到日志接口,请注意规避使用该漏洞版本组件。

其他问题

版本升级

依赖冲突

目前,SDK 依赖 okhttp 2.5.0,如果和其他依赖 okhttp3 的包混用时,有可能会报错,例如:Exception in thread "main" java.lang.NoSuchMethodError: okio.BufferedSource.rangeEquals(JLokio/ByteString;)Z。原因是 okhttp3 依赖 okio 1.12.0,而 okhttp 依赖 okio 1.6.0,maven 在解析依赖时的规则是路径最短优先和顺序优先,所以如果 SDK 在 pom.xml 依赖中先被声明,则 okio 1.6.0 会被使用,从而报错。在 SDK 没有升级到 okhttp3 前的解决办法:1)在 pom.xml 中明确指定依赖 okio 1.12.0 版本(注意可能有其他包需要用到更高的版本,变通下取最高版本就可以了);2)将 SDK 放在依赖的最后(注意如果此前已经编译过,需要先删除掉 maven 缓存的 okhttp 包),以同时使用依赖 okhttp3 的 CMQ SDK 为例,形如(注意变通版本号):

    <dependency>
      <groupId>com.qcloud</groupId>
      <artifactId>cmq-http-client</artifactId>
      <version>1.0.7</version>
    </dependency>
    <dependency>
      <groupId>com.tencentcloudapi.wemeet</groupId>
      <artifactId>wemeet-restapi-sdk-java</artifactId>
      <version>1.1.0</version>
    </dependency>

证书问题

证书问题通常是客户端环境配置错误导致的。SDK 没有对证书进行操作,依赖的是 Java 运行环境本身的处理。出现证书问题后,可以使用-Djavax.net.debug=ssl开启详细日志辅助判断。

有用户报告使用 IBM JDK 1.8 出现证书报错:javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure,使用 Oracle JDK 后问题消失。