让你的 Android 应用也能聊天(第二版)

by admin on 2019年2月2日

简介

自二零一八年 LeanCloud
公布实时通讯(IM)服务之后,基于用户反馈和工程师对需求的消化和对事情的提炼,下周专业发布了「实时通信2.0
」。设计理念一如既往是「灵活、解耦、可整合、可定制」,具体可以参见《实时通讯支出指南》,了解LeanCloud 实时通讯的基本概念和模型。

面前一篇大家介绍了 Office 365 REST API
的法定工具的运用,本篇大家来看一下 SharePoint REST API
本身的讲述、结构和动用方法,以及一些应用经验。

下载和装置

可以到 LeanCloud
官方下载点下载
LeanCloud IM SDK v2 版本。将下载到的 jar 包出席工程即可。

第一来看看SharePoint REST API 的概述:

一定的文书聊天

咱俩先从最不难易行的环节下手,看看怎么用 LeanCloud IM SDK v2
落成一对一文本摆龙门阵。

      REST API 服务是在 SharePoint 2013 中被引入的,官方认为 REST API
服务可以比美于现有的 SharePoint 客户端对象模型。开发人士可以动用任何帮衬REST Web 请求的技艺(C#,javascript,java,oc 等等)以长途格局与
SharePoint 数据开展彼此。那也就代表,开发人士可以利用 REST
Web技术和规范开放数据协议(OData)语法从其 SharePoint
相关应用程序、解决方案和客户端应用程序执行 CRUD 操作。而针对性中长途 Web
或位移使用,必须先得到访问权限,才能应用 SharePoint 数据资源。

初始化

和 LeanCloud 其余服务均等,实时聊天服务的先导化也是在 Application 的
onCreate 方法中展开的:

public class MyApplication extends Application{

    public void onCreate(){
      ...
      AVOSCloud.initialize(this,"{{appId}}","{{appKey}}");
      ...
    }
}

还要在AndroidManifest.xml中间阐明:

<manifest>
   ...

   <application
        android:name=".MyApplication"
        ....>
        ...

        <service android:name="com.avos.avoscloud.PushService" />

        <receiver android:name="com.avos.avoscloud.AVBroadcastReceiver">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <action android:name="android.intent.action.USER_PRESENT" />
            </intent-filter>
        </receiver>
        ...
   </application>

</manifest>

接下去大家需求完结用户登录。

     在 REST API 出现往日,大家需求经过 client.svc 这些 WCF 服务来呼吁
SharePoint
的列表数据,而且仅限于获取数据。数据的改动并没有在这一个服务中显示。而通过
REST API,我们得以成功前边提到的 CRUD 操作:使用OData 标准协会可完成REST 的 HTTP
请求,对应到相应的请求方法,就足以对该资源拓展读取或操作了。例如利用 GET
方法得到数据,使用 POST 方法来创制数量,使用 PUT 或 MERGE
方法来更新数据,使用 DELETE 方法来删除数据。

登录

若是聊天发起方名叫 汤姆,为直观起见,大家选择用户名来作为 clientId
登录聊天系统(LeanCloud 云端只需要 clientId
在动用内唯一即可,具体用什么样数据由应用层决定),代码如下:

AVIMClient imClient = AVIMClient.getInstance("Tom");
imClient.open(new IMClientCallback(){
  @Override
  public void done(AVIMClient client, AVException e) {
    if (null != e) {
      // 出错了,可能是网络问题无法连接 LeanCloud 云端,请检查网络之后重试。
      // 此时聊天服务不可用。
      e.printStackTrace();
    } else {
      // 成功登录,可以开始进行聊天了(假设为 MainActivity)。
      Intent intent = new Intent(currentActivity, MainActivity.class);
      currentActivity.startActivity(intent);
    };
  }
});

      REST API 默认会重临 Atom
格式的数额,然而大家也得以按照需要设定重返 JSON
格式的多寡。我个人更欣赏处理 JSON 格式,JSON 数据转换为 C#
的对象,有一个很棒的网站:http://json2csharp.com/。通过这一个网站,我们得以把
JSON 数据直接转换为 C# 对象,节省了千千万万编纂 C# 基础代码的时光。

确立对话

假若我们要跟「Bob」那个用户展开聊天,大家先成立一个会话,代码如下:

List<String> clientIds = new ArrayList<String>();
clientIds.add("Tom");
clientIds.add("Bob");

// 我们给对话增加一个自定义属性 type,表示单聊还是群聊
// 常量定义:
// int ConversationType_OneOne = 0; // 两个人之间的单聊
// int ConversationType_Group = 1;  // 多人之间的群聊
Map<String, Object> attr = new HashMap<String, Object>();
attr.put("type", ConversationType_OneOne);

imClient.createConversation(clientIds, attr, new AVIMConversationCreatedCallback() {
  @Override
  public void done(AVIMConversation conversation, AVException e) {
    if (null != conversation) {
      // 成功了,这时候可以显示对话的 Activity 页面(假定为 ChatActivity)了。
      Intent intent = new Intent(this, ChatActivity.class);
      Intent.putExtra(“conversation”, conversation);
      startActivity(intent);
    }
  }
});

确立的「对话」在控制台怎么查看

如您所见,大家创立一个会话的时候,指定了成员(汤姆 和
Bob)和一个非常的性质({type: 0})。这么些数据保存到云端后,你在
控制台 -> 存储 -> 数据 里面相会到,_Conversation
表中追加了一条记下,新记录的 m 属性值为["Tom", "Bob"]attr
属性值为{"type":0}。如您所料,m 属性就是对应着成员列表,attr
属性就是用户增添的额外属性值(以目的的款式储存)。

接下去我们来探视 REST API 的布局组成:

发送音信

建立好对话之后,要发送新闻是很简短的:

AVIMMessage message = new AVIMMessage();
message.setContent("hello");
conversation.sendMessage(message, new AVIMConversationCallback() {
  @Override
  public void done(AVException e) {
    if (null != e) {
      // 出错了。。。
      e.printStackTrace();
    } else {
      Logger.d("发送成功,msgId=" + message.getMessageId());
    }
  }
});

好了,那样一条音讯就发送过去了。但是问题来了,对于「鲍伯」而言,他怎么才能选用别人发给她的新闻呢?

      端点的基本URL是:https://server/site/_api ,它是负有 SharePoint
REST API 的根底,其中 server 代表服务器的称呼,site
代表一定网站的称谓或者路径。

新闻接收

在 Bob 这一端,要能接收到新闻,须求如下几步:

1,举行起初化;

2,完毕协调的 AVIMMessageHandler,响应新新闻到达公告,重倘若之类函数:

public void onMessage(AVIMMessage message, AVIMConversation conversation, AVIMClient client);

对此 汤姆 发过来的音信,要出示出来,大家只需兑现 onMessage
即可,示例代码如下:

class CustomMessageHandler extends AVIMMessageHandler {
  @Override
  public void onMessage(AVIMMessage message, AVIMConversation conversation, AVIMClient client) {
    // 新消息到来了。在这里增加你自己的处理代码。
    String msgContent = message.getContent();
    Logger.d(conversation.getConversationid() + " 收到一条新消息:" + msgContent);
  }
}

3,进行登录,代码也与发送端一样。

完全代码如下:

// 自定义消息响应类
class CustomMessageHandler extends AVIMMessageHandler {
  @Override
  public void onMessage(AVIMMessage message, AVIMConversation conversation, AVIMClient client) {
    // 新消息到来了。在这里增加你自己的处理代码。
    String msgContent = message.getContent();
    Logger.d(conversation.getConversationid() + " 收到一条新消息:" + msgContent);
  }
}

// application 的初始化部分
public void onCreate(){
  ...
  AVOSCloud.initialize(this,"{{appId}}","{{appKey}}");
  AVIMMessageManager.registerDefaultMessageHandler(new CustomMessageHandler());
  ...
}

// 用户登录部分
AVIMClient imClient = AVIMClient.getInstance("Bob");
imClient.open(new IMClientCallback(){
  @Override
  public void done(AVIMClient client, AVException e) {
    if (null != e) {
      // 出错了,可能是网络问题无法连接 LeanCloud 云端,请检查网络之后重试。
      // 此时聊天服务不可用。
      e.printStackTrace();
    } else {
      // 成功登录,可以开始进行聊天了。
    };
  }
});

注意!
AVIMMessageManager.registerDefaultMessageHandler() 一定要在
AVIMClient.open() 此前调用,否则恐怕导致服务器发回去的片段信息丢失。

     
若是要拜访特定的网站集,URL是:https://server/site/\_api/site,如若要拜访特定的网站,URL则是:https://server/site/\_api/web
。那二种是最常用的 API ,还有三种 API
能完毕部分特定的法力,如:使用搜索服务:https://server/site/\_api/search,访问用户配置文件:http://server/site/_api/SP.UserProfiles.PeopleManager 等。

多少个首要的回调接口

从地点的例证中得以看来,要收取到别人给您发送的音信,要求重载
AVIMMessageHandler 类。从 v2 版开头,LeanCloud IM SDK
多量用到回调来举报操作结果,可是对于部分消极的音讯公告,则如故使用接口来兑现的,包罗:

  • 脚下互连网出现转移
  • 对话中有新的消息
  • 对话中有新成员参预
  • 对话中有成员离开
  • 被特邀出席某对话
  • 被踢出对话

LeanCloud IM SDK 内部采取了三种接口来响应这几个事件。

      下边大家以特定网站为例,来看一下 REST API
能到位哪些常见操作:

网络事件响应接口

重大用以处理网络转移事件,接口定义在
AVIMClientEventHandler,首要函数为:

  /**
   * 实现本方法以处理网络断开事件
   */
  public abstract void onConnectionPaused(AVIMClient client);

  /**
   * 实现本方法以处理网络恢复事件
   */
  public abstract void onConnectionResume(AVIMClient client);

在互联网中断的气象下,所有的信息收发和对话操作都会师世难点。

通过 AVIMClient.setClientEventHandler(AVIMClientEventHandler handler)
可以设定全局的 Client伊夫ntHandler。

      (1)对列表和列表项的操作

对话成员变动响应接口

一言九鼎用以处理对话中成员变动的事件,接口定义在
AVIMConversationEventHandler,主要函数为:

  /**
   * 实现本方法以处理聊天对话中的参与者离开事件
   *
   * @param members 离开的参与者
   * @param kickedBy 踢人者,自愿退出的情况下踢人者就是参与者
   */
  public abstract void onMemberLeft(AVIMClient client,
      AVIMConversation conversation, List<String> members, String kickedBy);

  /**
   * 实现本方法以处理聊天对话中的参与者加入事件
   *
   * @param members 加入的参与者
   * @param invitedBy 邀请人,有可能是加入的参与者本身
   */
  public abstract void onMemberJoined(AVIMClient client,
      AVIMConversation conversation, List<String> members, String invitedBy);

  /**
   * 实现本方法来处理当前用户被踢出某个聊天对话事件
   *
   * @param kickedBy 踢出你的人
   */
  public abstract void onKicked(AVIMClient client, AVIMConversation conversation,
      String kickedBy);

  /**
   * 实现本方法来处理当前用户被邀请到某个聊天对话事件
   *
   * @param conversation 被邀请的聊天对话
   * @param operator 邀请你的人
   */
  public abstract void onInvited(AVIMClient client, AVIMConversation conversation,
      String operator);

通过
AVIMMessageManager.setConversationEventHandler(AVIMConversationEventHandler handler)
能够安装全局的 Conversation伊夫ntHandler。

       列表:

音讯响应接口

要害用以处理新音讯到达事件,接口定义在
MessageHandlerAVIMMessageHandler
是一个空的落成类,大家理应经过重载 AVIMMessageHandler
的连带措施来形成音信处理。主要的方法有:

  // 收到新的消息
  @Override
  public void onMessage(AVIMMessage message, AVIMConversation conversation);

  // 自己发送的消息已经被对方接收
  @Override
  public void onMessageReceipt(AVIMMessage message, AVIMConversation conversation, AVIMClient client);

通过 AVIMMessageManager.registerDefaultMessageHandler(handler)
能够安装全局的 MessageHandler。

我们兑现那三类接口,就足以处理所有的关照信息了。示例代码如下:

class CustomNetworkHandler extends AVIMClientEventHandler {
  @Override
  public void onConnectionPaused(AVIMClient client) {
    // 请按自己需求改写
    Logger.d("connect paused");
  }

  @Override
  public void onConnectionResume(AVIMClient client) {
    // 请按自己需求改写
    Logger.d("connect resume");
  }
}

class CustomConversationHandler extends AVIMConversationEventHandler {
  public private Context gContext = null;
  private void toast(String str) {
    Toast.makeText(gContext, str, Toast.LENGTH_SHORT).show();
  }
  private void toast(Context context, String str) {
    Toast.makeText(context, str, Toast.LENGTH_SHORT).show();
  }

  @Override
  public void onMemberLeft(AVIMClient client, AVIMConversation conversation, List<String> members, String kickedBy) {
    // 请按自己需求改写
    toast(MsgUtils.nameByUserIds(members) + " left, kicked by " + MsgUtils.nameByUserId(kickedBy));
    //注:MsgUtils 是一个辅助类,nameByUserIds 用来将 userId 转换成用户名
  }

  @Override
  public void onMemberJoined(AVIMClient client, AVIMConversation conversation, List<String> members, String invitedBy) {
    // 请按自己需求改写
    toast(MsgUtils.nameByUserIds(members) + " joined , invited by " + MsgUtils.nameByUserId(invitedBy));
    //注:MsgUtils 是一个辅助类,nameByUserIds 用来将 userId 转换成用户名
  }

  @Override
  public void onKicked(AVIMClient client, AVIMConversation conversation, String kickedBy) {
    // 请按自己需求改写
    toast("you are kicked by " + MsgUtils.nameByUserId(kickedBy));
  }

  @Override
  public void onInvited(AVIMClient client, AVIMConversation conversation, String operator) {
    // 请按自己需求改写
    toast("you are invited by " + MsgUtils.nameByUserId(operator));
  }
};

class CustomMsgHandler extends AVIMMessageHandler {
  @Override
  public void onMessage(AVIMMessage message, AVIMConversation conversation, AVIMClient client) {
    // 请按自己需求改写
    String msgContent = message.getContent();
    Logger.d(conversation.getConversationid() + " 收到一条新消息:" + msgContent);
  }

  @Override
  public void onMessageReceipt(AVIMMessage message, AVIMConversation conversation, AVIMClient client) {
    // 请按自己需求改写
    Logger.d("发往对话 " + conversation.getConversationid() + " 的消息 "+ message.getMessageId() +" 已被接收");
  }
}

// 设置事件响应接口
AVIMClient.setClientEventHandler(new CustomNetworkHandler());
AVIMMessageManager.setConversationEventHandler(new CustomConversationHandler());
AVIMMessageManager.registerDefaultMessageHandler(new CustomMsgHandler());

       URL:http://&lt;网站 URL>/web/lists(guid'<列表 ID>’) 或 http://&lt;网站 URL>/web/lists/getbytitle(‘title of
list’)

支撑富媒体的谈天音信

上面的代码演示了哪些发送简单文本音讯,不过现在的交互格局已经越发各类化,图像、语音、视频已是分外广阔的音信类型。v2
版的 LeanCloud IM SDK 已经得以很好地支撑那些富媒体音讯,具体表明如下:

      
列表项集合:

基类:AVIMTypedMessage

抱有富媒体音讯的基类,其表明为

//SDK定义的消息类型,LeanCloud SDK 自身使用的类型是负数,所有正数留给开发者自定义扩展类型使用,0 作为「没有类型」被保留起来。
enum AVIMReservedMessageType {
  UnsupportedMessageType(0),
  TextMessageType(-1),
  ImageMessageType(-2),
  AudioMessageType(-3),
  VideoMessageType(-4),
  LocationMessageType(-5),
  FileMessageType(-6);
};

public abstract class AVIMTypedMessage extends AVIMMessage {
  public AVIMTypedMessage();

  public int getMessageType();

  @Override
  public final String getContent();

  @Override
  public final void setContent(String content);
}

       URL:http://&lt;网站 URL>/web/lists(guid'<列表 ID>’) /items 或 http://&lt;网站 URL>/web/lists/getbytitle(‘title of
list’)/items

文本音讯(AVIMTextMessage)

AVIMTypedMessage 子类,表示一般的文书新闻,其声称为

public class AVIMTextMessage extends AVIMTypedMessage {
  public String getText();
  public void setText(String text);

  public Map<String, Object> getAttrs();
  public void setAttrs(Map<String, Object> attr);
}

可以看到,对于文本音信,首要的习性有 textattr 五个,通过简单的
getter/setter 就足以访问到。要发送文书新闻,示例代码为:

AVIMTextMessage message = new AVIMTextMessage();
message.setText("hello");
conversation.sendMessage(message, new AVIMConversationCallback() {
  @Override
  public void done(AVException e) {
    if (null != e) {
      // 出错了。。。
      e.printStackTrace();
    } else {
      Logger.d("message sent.");
    }
  }
});

     
指定 ID 的列表项:

文本音信(AVIMFileMessage)

AVIMTypedMessage
子类,用来发送带附件的音讯,开发者能够用它来发送「离线文件」。对于此类音信,LeanCloud
IM SDK 内部会先把文件上传到 LeanCloud 文件存储服务器(自带 CDN
效能),然后把公文元数据(url,文件大小等等)放在音讯包内发送到
LeanCloud 实时通讯服务端。其构造函数申明为:

// 传入本地文件路径,构造消息对象
public AVIMFileessage(String localPath) throws FileNotFoundException, IOException;
// 传入本地文件,构造消息对象
public AVIMFileMessage(File localFile) throws FileNotFoundException, IOException;
// 传入 AVFile 实例,构造消息对象
public AVIMFileMessage(AVFile file);

与公事新闻看似,文件信息也帮衬附带文本和其余自定义属性,可以因而如下方法添加
/ 获取越来越多消息:

  • String getText() / void setText(String text)
  • Map<String, Object> getAttrs() / void setAttrs(Map<String,
    Object> attr);

出殡文书信息的演示代码为:

String localZipfilePath;
try {
  AVIMFileMessage message = new AVIMFileMessage(localZipfilePath);
  message.setText("这是你要的文档");
  conversation.sendMessage(message, new AVIMConversationCallback() {
    @Override
    public void done(AVException e) {
      if (null != e) {
        // 出错了。。。
        e.printStackTrace();
      } else {
        Logger.d("message sent");
      }
    }
  });
} catch (Exception ex) {
}

收起到如此音讯之后,开发者可以由此以下方式,获取到文件元数据(size
等)和一个暗含二进制数据的 AVFile 对象:

  • AVFile getAVFile() 方法会重返一个二进制文件的 AVFile
    实例,之后方可经过 AVFile 来完结多少下载或者其余操作,具体可以参见
    AVFile
    说明
  • String getFileUrl() 方法会重返二进制文件的 url
  • long getSize() 方法会重返二进制文件的实际上尺寸(单位:byte)
  • Map<String, Object> getFileMetaData()
    可以收获二进制文件的其余元数据音讯。

      URL:http://&lt;网站 URL>/web/lists(guid'<列表 ID>’) /items(item id) 或 http://&lt;网站 URL>/web/lists/getbytitle(‘title of
list’)/items(item
id)

图像音讯(AVIMImageMessage)

AVIMFileMessage
子类,专门用来发送图像和附带文本的混合音信,其构造函数表明为:

// 传入本地文件路径,构造消息对象
public AVIMImageMessage(String localPath) throws FileNotFoundException, IOException;
// 传入本地文件,构造消息对象
public AVIMImageMessage(File localFile) throws FileNotFoundException, IOException;
// 传入 AVFile 实例,构造消息对象
public AVIMImageMessage(AVFile file);

出殡图像新闻的言传身教代码为:

String localImagePath;
try {
  AVIMImageMessage message = new AVIMImageMessage(localImagePath);
  message.setText("你说我好看不?");
  conversation.sendMessage(message, new AVIMConversationCallback() {
    @Override
    public void done(AVException e) {
      if (null != e) {
        // 出错了。。。
        e.printStackTrace();
      } else {
        Logger.d("message sent");
      }
    }
  });
} catch (Exception ex) {
}

接到到这么新闻随后,开发者可以透过如下方法,获取到多少图像元数据(width,height,图像
size)和一个暗含图像数据的 AVFile 对象:

  • int getWidth() 方法会重回图像的升幅(单位:pixel)
  • int getHeight() 方法会重返图像的莫大(单位:pixel)
  • AVFile getAVFile() (继承自
    AVIMFileMessage)方法会重回一个图像文件的 AVFile 实例
  • String getFileUrl() (继承自 AVIMFileMessage)方法会重回图像文件的
    url
  • long getSize() (继承自
    AVIMFileMessage)方法会再次来到图像文件的实际上尺寸(单位:byte)
  • String getText() (继承自
    AVIMFileMessage)方法会重临随图像一起发送的文书音信。
  • Map<String, Object> getFileMetaData() (继承自
    AVIMFileMessage)可以取得图像的任何元数据音讯。

      
如上 API 地址所示,大家得以由此List 本身的 GUID 或者 Title
来赢得List,或者List的项集合的数额。当须求向列表中插入新项时,大家需求选用列表项集合
API,使用 POST
方法插入数据。而急需修改列表中某一项时,则需求动用指定列表项 API,使用
MERGE 方法来更新数据。

节奏音讯(AVIM奥迪oMessage)

AVIMFileMessage
子类,专门用来发送语音和附带文本的搅和新闻,其构造函数注解为:

// 传入本地文件路径,构造消息对象
public AVIMAudioMessage(String localPath) throws FileNotFoundException, IOException;
// 传入本地文件,构造消息对象
public AVIMAudioMessage(File localFile) throws FileNotFoundException, IOException;   
// 传入 AVFile 实例,构造消息对象
public AVIMAudioMessage(AVFile file);

出殡音频音讯的以身作则代码为:

String localAudioPath;
try {
  AVIMAudioMessage message = new AVIMAudioMessage(localAudioPath);
  message.setText("听听我唱的小苹果:)");
  conversation.sendMessage(message, new AVIMConversationCallback() {
    @Override
    public void done(AVException e) {
      if (null != e) {
        // 出错了。。。
        e.printStackTrace();
      } else {
        Logger.d("message sent");
      }
    }
  });
} catch (Exception ex) {
}

收起到那样音讯之后,开发者可以经过如下方法,获取到几何音频元数据(时长
duration、音频 size)和一个饱含音频数据的 AVFile 对象:

  • double getDuration() 方法会再次回到音频的尺寸(单位:秒)
  • AVFile getAVFile() (继承自
    AVIMFileMessage)方法会再次来到一个音频文件的 AVFile 实例
  • String getFileUrl() (继承自 AVIMFileMessage)方法会再次来到音频文件的
    url
  • long getSize() (继承自
    AVIMFileMessage)方法会重回音频文件的实在尺寸(单位:byte)
  • String getText() (继承自
    AVIMFileMessage)方法会重返随音频一起发送的文件新闻。
  • Map<String, Object> getFileMetaData() (继承自
    AVIMFileMessage)可以赢得音频的其它元数据音信。

      
而涉嫌到数量修改时,大家必要把措施类型,如 POST,MERGE
等作为X-HTTP_Method
键的值添加到请求标头中。而且必要将请求窗体摘要值作为 X-RequestDigest
的值传递进入。该值的得到形式是:向 http://网站URL/\_api/contextinfo
发送所有空正文的 POST 请求,并在 contextinfo 终结点再次回到的 XML 中领到
d:FormDigestValue 节点的值。还有就是标头中的 IF-MATCH
键的值,须要赋值为列表或列表项的 etag 值。如若赋值为
“*”,则不会设想并发难题。

视频音信(AVIMVideoMessage)

AVIMFileMessage
子类,专门用来发送摄像和附带文本的鱼目混珠音信,其构造函数注明为:

// 传入本地文件路径,构造消息对象
public AVIMVideoMessage(String localPath) throws FileNotFoundException, IOException;
// 传入本地文件,构造消息对象
public AVIMVideoMessage(File localFile) throws FileNotFoundException, IOException;
// 传入 AVFile 文件,构造消息对象
public AVIMVideoMessage(AVFile file);

发送摄像音信的以身作则代码为:

String localVideoPath;
try {
  AVIMVideoMessage message = new AVIMVideoMessage(localVideoPath);
  message.setText("敢不敢跟我比一比");
  conversation.sendMessage(message, new AVIMConversationCallback() {
    @Override
    public void done(AVException e) {
      if (null != e) {
        // 出错了。。。
        e.printStackTrace();
      } else {
        Logger.d("message sent");
      }
    }
  });
} catch (Exception ex) {
}

接收到如此消息之后,开发者可以可以因此如下方法,获取到多少摄像元数据(时长
duration、摄像 size)和一个带有视频数据的 AVFile 对象:

  • double getDuration() 方法会重临视频的尺寸(单位:秒)
  • AVFile getAVFile() (继承自
    AVIMFileMessage)方法会再次回到一个摄像文件的 AVFile 实例
  • String getFileUrl() (继承自 AVIMFileMessage)方法会重返视频文件的
    url
  • long getSize() (继承自
    AVIMFileMessage)方法会重回视频文件的实在尺寸(单位:byte)
  • String getText() (继承自
    AVIMFileMessage)方法会再次来到随视频一起发送的文件新闻。
  • Map<String, Object> getFileMetaData() (继承自
    AVIMFileMessage)可以博得视频的其余元数据新闻。

      
其余关于数据操作是索要 POST 的始末:

地理地方音信(AVIMLocationMessage)

AVIMTypedMessage
子类,扶助发送地理地方信息和附带文本的搅和信息,其表明为:

public class AVIMLocationMessage extends AVIMTypedMessage {
  public String getText();
  public void setText(String text);

  public Map<String, Object> getAttrs();
  public void setAttrs(Map<String, Object> attr);

  public AVGeoPoint getLocation();
  public void setLocation(AVGeoPoint location);
}

与公事音信看似,地理地方音讯只是增多了一个 AVGeoPoint 的 Location
属性。要发送地方新闻的演示代码为:

AVIMLocationMessage message = new AVIMLocationMessage();
message.setText("快点过来!");
message.setLocation(new AVGeoPoint(15.9, 56.4));
conversation.sendMessage(message, new AVIMConversationCallback() {
  @Override
  public void done(AVException e) {
    if (null != e) {
      // 出错了。。。
      e.printStackTrace();
    } else {
      Logger.d("message sent");
    }
  }
});

收受到如此的音讯之后,开发者可以拿走到实际的地理地点数据。

      
更新时,必须包含 __metadata:type
和急需更新的字段。其余不要求立异的字段可以不投入。删除时,URL指向该条记录即可。添加时,URL指向记录集合,POST内容应涵盖__metadata:type 和急需插入的必填字段

哪些接受富媒体新闻

新版 LeanCloud IM SDK 内部封装了对富媒体音讯的扶助,所有富媒体信息都是从
AVIMTypedMessage 派生出来的。发送的时候可以直接调用
conversation.sendMessage()
函数。在接收端,我们也更加扩展了一类回调接口
AVIMTypedMessageHandler,其定义为:

public class AVIMTypedMessageHandler<T extends AVIMTypedMessage> extends MessageHandler<T> {

  @Override
  public void onMessage(T message, AVIMConversation conversation, AVIMClient client);

  @Override
  public void onMessageReceipt(T message, AVIMConversation conversation, AVIMClient client);
}

开发者可以编制自己的音讯处理 handler,然后调用
AVIMMessageManager.registerMessageHandler(Class<? extends AVIMMessage> clazz, MessageHandler<?> handler)
函数来注册目的 handler。

接收端对于富媒体音讯的通报处理的演示代码如下:

class MsgHandler extends AVIMTypedMessageHandler<AVIMTypedMessage> {

  @Override
  public void onMessage(AVIMTypedMessage message, AVIMConversation conversation, AVIMClient client) {
    // 请按自己需求改写
    switch(message.getMessageType()) {
    case AVIMReservedMessageType.TextMessageType:
      AVIMTextMessage textMsg = (AVIMTextMessage)message;
      Logger.d("收到文本消息:" + textMsg.getText() + ", msgId:" + textMsg.getMessageId());
      break;
    case AVIMReservedMessageType.FileMessageType:
      AVIMFileMessage fileMsg = (AVIMFileMessage)message;
      Logger.id("收到文件消息。msgId=" + fileMsg.getMessageId() + ", url=" + fileMsg.getFileUrl() + ", size=" + fileMsg.getSize());
      break;
    case AVIMReservedMessageType.ImageMessageType:
      AVIMImageMessage imageMsg = (AVIMImageMessage)message;
      Logger.id("收到图片消息。msgId=" + imageMsg.getMessageId() + ", url=" + imageMsg.getFileUrl() + ", width=" + imageMsg.getWidth() + ", height=" + imageMsg.getHeight());
      break;
    case AVIMReservedMessageType.AudioMessageType:
      AVIMAudioMessage audioMsg = (AVIMAudioMessage)message;
      Logger.id("收到音频消息。msgId=" + audioMsg.getMessageId() + ", url=" + audioMsg.getFileUrl() + ", duration=" + audioMsg.getDuration());
      break;
    case AVIMReservedMessageType.VideoMessageType:
      AVIMVideoMessage videoMsg = (AVIMAudioMessage)message;
      Logger.id("收到视频消息。msgId=" + videoMsg.getMessageId() + ", url=" + videoMsg.getFileUrl() + ", duration=" + videoMsg.getDuration());
      break;
    case AVIMReservedMessageType.LocationMessageType:
      AVIMLocationMessage locMsg = (AVIMLocationMessage)message;
      Logger.id("收到位置消息。msgId=" + locMsg.getMessageId() + ", latitude=" + locMsg.getLocation().getLatitude() + ", longitude=" + locMsg.getLocation().getLongitude());
      break;
    }
  }

  @Override
  public void onMessageReceipt(AVIMTypedMessage message, AVIMConversation conversation, AVIMClient client) {
  }
}
MsgHandler msgHandler = new MsgHandler();
AVIMMessageManager.registerMessageHandler(AVIMTypedMessage.class, msgHandler);

LeanCloud IM SDK 内部信息分发的逻辑是这么的:对于收受的任一新音信,SDK
内部都会先解析音讯的品类,依照项目找到开发者为这一门类注册的拍卖
handler,然后逐一调用那几个 handler 的 onMessage
函数。若是没有找到专门处理这一档次音讯的 handler,就会传递给
defaultHandler 处理。

那样一来,在开发者为 TypedMessage(及其子类) 指定了专门的
handler,也指定了全局的 defaultHandler
了的时候,即使发送端发送的是通用的 AVIMMessage 音讯,那么接受端就是
AVIMMessageManager.registerDefaultMessageHandler()中指定的 handler
被调用;如若发送的是 AVIMTypedMessage(及其子类)的音讯,那么接受端就是
AVIMMessageManager.registerMessageHandler()中指定的 handler 被调用。

      (2)对文件和文件夹的操作

怎样扩展自己的富媒体音讯

此起彼伏于
AVIMTypedMessage,开发者也足以增加自己的富媒体信息。其要求和步骤是:

  • 兑现新的音信类型,继承自 AVIMTypedMessage。这里须求小心两点:
    • 在 class 上平添一个 @AVIMMessageType(type=123) 的
      Annotation,具体新闻类型的值(123)由开发者自己决定(LeanCloud
      内建的音信类型应用负数,所有正数都预留给开发者扩充使用)。
    • 在音讯内部属性上要加进 @AVIMMessageField(name=””) 的
      Annotation,name
      为可选字段在宣称字段属性,同时自定义的字段要有相应的
      getter/setter 方法。
  • 调用
    AVIMMessageManager.registerAVIMMessageType(Class<? extends AVIMTypedMessage> messageType)
    函数进行项目注册
  • 调用
    AVIMMessageManager.registerMessageHandler(Class<? extends AVIMMessage> clazz, MessageHandler<?> handler)
    函数进行音信处理 handler 注册。

AVIMTextMessage 的源码如下,可供参考:

@AVIMMessageType(type = -1)
public class AVIMTextMessage extends AVIMTypedMessage {

  @AVIMMessageField(name = "_lctext")
  String text;
  @AVIMMessageField(name = "_lcattrs")
  Map<String, Object> attrs;

  public String getText() {
    return this.text;
  }

  public void setText(String text) {
    this.text = text;
  }

  public Map<String, Object> getAttrs() {
    return this.attrs;
  }

  public void setAttrs(Map<String, Object> attr) {
    this.attrs = attr;
  }
}

       文件:

群组聊天

与前方的单聊类似,群组聊天也急需先创造一个会话(AVIMConversation),然后发送、接收新的音讯。

       URL:http://&lt;网站
URL>/_api/web/getfilebyserverrelativeurl(‘/<文件夹名称>/<文件名称>’)

成立群组

和单聊类似,建立一个多个人聊天的群组也是很粗略的。例如:

Map<String, Object> attr = new HashMap<String, Object>();
attr.put("type", ConversationType_Group);
imClient.createConversation(clientIds, attr, new AVIMConversationCreatedCallback() {
  @Override
  public void done(AVIMConversation conversation, AVException e) {
    if (null != conversation) {
      // 成功了!
      Intent intent = new Intent(currentActivity, ChatActivity.class);
      Intent.putExtra(“conversation”, conversation);
      currentActivity.startActivity(intent);
    }
  }
});

成功将来,我们就足以进来聊天界面了。

       文件列表:

往群组发送音讯

出殡音信分外简单,与前方单聊的场景一样。

咱俩会注意到,AVIMConversation 还有一个殡葬信息的艺术:

public void sendMessage(final AVIMMessage message, final int messageFlag,
      final AVIMConversationCallback callback)

而那里 flag 的定义有如下两种档次:

  • 暂态新闻(AVIMConversation.TRANSIENT_MESSAGE_FLAG)。那种新闻不会被自动保存(未来在历史新闻中不可以找到它),也不帮忙延迟接收,离线用户更不会吸收推送文告,所以适合用来做控制协议。譬如聊天进程中「某某正在输入中…」那样的情状音讯,就符合通过暂态音讯来发送。
  • 普通音信(AVIMConversation.NONTRANSIENT_MESSAGE_FLAG)。那种音信就是我们最常用的新闻类型,在
    LeanCloud
    云端会自行保存起来,援救延迟接收和离线推送,将来在历史音信中得以找到它。
  • 待回执信息(AVIMConversation.RECEIPT_MESSAGE_FLAG)。这也是一种常见新闻,只是音信被对方接收之后
    LeanCloud 服务端会发送一个回执通告给发送方(那就是
    AVIMMessageHandler 中
    public void onMessageReceipt(AVIMMessage message, AVIMConversation conversation, AVIMClient client)
    函数被调用的火候)。

       URL:http://&lt;网站
URL>/_api/web/getfolderbyserverrelativeurl(‘/<文件夹名称>’)/files

收到群组音讯

收起一个群组的音讯,与接受单聊的音讯也是同一的。

       文件夹:

成员管理

在查询到聊天室成员之后,可以让用户特邀一些团结的仇人进入,作为管理员也足以去除一些「可怕」的成员。
参预新成员的 API 如下:

// 假设需要邀请 Alex,Ben,Chad 三人加入对话
List<String> userIds = new ArrayList<String>();
userIds.add("Alex");
userIds.add("Ben");
userIds.add("Chad");
conversation.addMembers(userIds, new AVIMConversationCallback() {
  @Override
  public void done(AVException error) {
    if (null != error) {
      // 加入失败,报错.
      error.printStackTrace();
    } else {
      // 发出邀请,此后新成员就可以看到这个对话中的所有消息了。
      Logger.d("invited.");
    }
  }
});

特约成功之后,相关方收到文告的时序是那般的:

    操作者(管理员)                    被邀请者                        其他人
1, 发出请求 addMembers
2,                               收到 onInvited 通知
3, 收到 onMemberJoined 通知      收到 onMemberJoined 通知      收到 onMemberJoined 通知

对应地,踢人时的调用 API 是:

List<String> userIds = new ArrayList<String>();
userIds.add("Alex");
conversation.kickMembers(userIds, new AVIMConversationCallback() {
  @Override
  public void done(AVException error) {
    if (null != error) {
      // 失败,报错.
      error.printStackTrace();
    } else {
      // 成功。
      Logger.d("kicked.");
    }
  }
});

踢人时,相关方收到公告的时序如下:

    操作者(管理员)                被踢者                       其他人
1, 发出请求 kickMembers
2,                          收到 onKicked 通知
3, 收到 onMemberLeft 通知                             收到 onMemberLeft 通知

注意!
假若约请、踢人操作暴发的时候,被诚邀者/被踢者当前不在线,那么文告音讯并不会被离线缓存,所以她们再上线的时候将不会吸收通告。

       URL:http://&lt;网站
URL>/_api/web/getfolderbyserverrelativeurl(‘/<文件夹名称>’)

赢得历史音信

LeanMessage 会将非暂态音信自动保存在云端,之后开发者能够经过
AVIMConversation 来得到该对话的兼具历史消息。获取历史音信的 API 如下:

String oldestMsgId;
long oldestMsgTimestamp;
conversation.queryMessages(oldestMsgId,oldestMsgTimestamp, limit, new AVIMHistoryMessageCallback(){
  @Override
  public void done(List<AVIMMessage> messages, AVException e) {
    if (null != e) {
      // 出错了:(
    } else {
      // 成功,可以将消息加入缓存,同时更新 UI
    }
  }
});

注意:
必发365bifa0000,得到历史信息的时候,LeanCloud
云端是从某条音信初叶,往前寻找开发者指定的 N
条新闻,重临给客户端。为此,获取历史新闻必要传入三个参数:初步音讯的
msgId,起先音信的发送时间戳,须要取得的音讯条数。

经过这一 API 获得的新闻就是 AVIMMessage 或者 AVIMTypedMessage
实例数组,开发者可以像此前接受新信息公告一致处理。

       通过以上 API
操作,我们得以成功文件和文书夹的读取,上传和修改等操作。

启用离线音讯推送(仅对 iOS 平台用户有效)

甭管是单聊照旧群聊,当用户 A
发出音信后,即使目标对话中有部分用户眼前不在线,LeanCloud
云端可以提供离线推送的法子来提醒用户。这一职能默许是关闭的,你可以在
LeanCloud 应用控制塞内加尔达喀尔开启它。开启方法如下:

  • 签到 LeanCloud 应用控制台,选取正确的利用进入;
  • 挑选最上边的「音信」服务,依次点击左侧菜单「实时音信」->「设置」;
  • 在左侧「iOS
    用户离线时的推送内容」下填好你要推送出去的信息内容,保存;

诸如此类 iOS 平台上的用户就足以采取 Push Notification
了(当然,前提是使用本身申请到了 RemoteNotification
权限,也将科学的推送证书上传到了 LeanCloud 控制台)。

       当需求向文档库插入文档时,URL
是:http://&lt;site
url>/_api/web/GetFolderByServerRelativeUrl(‘/Shared
Documents’)/Files/add(url=’a.txt’,overwrite=true),那样,大家就把公文以
a.txt 为寄放名称插入到了 Shared Documents
文档库中。而文档内容的上传进程是:文件读取为 Stream,放入 POST
内容中。文件还有其余不少中操作方法,如更新,签出,签入,删除等。

群组新闻免纷扰(仅对 iOS 平台用户有效)

甭管是单聊照旧群聊,对于发往普通的 Conversation
的常见音信,固然接收方当前不在线,LeanCloud 云端帮助通过 Push
Notification
的法子举行提示。一般情形下那都是很好的,可是即使某个群组越发活泼,那离线用户就会接受过多的推送,会形成不小的侵扰。

对此 LeanCloud IM 服务也同意单个用户来关闭/打开某个对话的离线推送成效。

      (3)对用户、组和角色的操作

找寻群组

甭管是单聊,仍然群聊,在 LeanCloud IM SDK
里面都是对话(Conversation)。我们给对话设置了之类二种属性:

  • conversationId,字符串,对话 id,只读,对话创立之后由 LeanCloud
    云端赋予一个大局唯一的 id。
  • creator,字符串,对话创制者 id,只读,标识对话创设者信息
  • members,数组,对话参加者,那里记录了具有的插足者
  • name,字符串,对话的名字,optional,可用来对于群组命名
  • attributes,Map/Dict,自定义属性,optional,供开发者自己增添用。

俺们提供了尤其的类,来寻觅一定的群组:通过 imClient.getQuery()
得到一个 AVIMConversationQuery 实例,然后调用
AVIMConversationQuery.wherexxx
多级措施来充实约束原则。例如要摸索当前报到用户参预的所有群聊对话,其代码为

// 搜索 Tom 参与的所有群组对话
List<String> clients = new ArrayList<String>();
clients.add("Tom");
AVIMConversationQuery conversationQuery = imClient.getQuery();
conversationQuery.containsMember(clients);

// 之前有常量定义:
// const int ConversationType_OneOne = 0;
// const int ConversationType_Group = 1;
conversationQuery.whereEqualTo("attr.type", ConversationType_Group);

conversationQuery.findInBackground(new AVIMConversationQueryCallback(){
  @Override
  public void done(List<AVIMConversation> conversations, AVException e) {
    if (null != e) {
      // 出错了。。。
      e.printStackTrace();
    } else {
      if (null != conversation) {
        Logger.d("找到了符合条件的 " + conversations.size() + " 个对话");
      } else {
        Logger.d("没有找到符合条件的对话");
      }
    }
  }
});

AVIMConversationQuery 中设置规范的法门与 AVQuery 类似。这里
conversationQuery.containsMember()
表示对话的分子中足足含有那个人士,可用来按照一些成员查找对话;与此类似的还有一个
conversationQuery.withMembers()
则表示有且仅有那个成员,用来依照所有成员查找目的对话;conversationQuery.whereXXX()
种类措施可用来界定对话名称和自定义属性,那里要强调的一些是,对于自定义属性的束缚原则,属性名一定要以
attr 开端,如上例所示,限定额外的 type 条件的时候必要指定的属性名是
attr.type。具体可以参见其头文件。

       组:

绽开聊天室

开放聊天室(也叫暂态对话)可以用来很多地点,譬如弹幕、直播等等。在
LeanCloud IM SDK
中,开放聊天室是一类特殊的群组,它也支撑创立、参与/踢出成员等操作,音信记录会被封存并可供获取;与平常群组不同的地方实际浮现为:

  • 不辅助查询成员列表,你可以透过相关 API 查询在线人数;
  • 不帮忙离线信息、离线推送布告等职能;
  • 从不成员进入、离开的打招呼;
  • 一个用户两次登录只能够插手一个绽放聊天室,插手新的盛开聊天室后会自动离开原先的聊天室;
  • 参预后半钟头内断网重连会活动进入原聊天室,当先那一个时间则要求重新参预;

       URL:http://&lt;网站 URL>/_api/web/sitegroups(<组 ID>)

创制开放聊天室

和一般的群组类似,建立一个绽放聊天室也是很粗略的,只是在
AVIMClient.createConversation(conversationMembers, name, attributes, isTransient, callback)
中大家须要传入 isTransient=true 选项。例如:

Map<String, Object> attr = new HashMap<String, Object>();
attr.put("type", ConversationType_Group);
imClient.createConversation(clientIds, name, attr, true, new AVIMConversationCreatedCallback() {
  @Override
  public void done(AVIMConversation conversation, AVException e) {
    if (null != conversation) {
      // 成功了,进入聊天室
      Intent intent = new Intent(currentActivity, ChatActivity.class);
      Intent.putExtra(“conversation”, conversation);
      currentActivity.startActivity(intent);
    }
  }
});

创立成功之后,大家就可以进去聊天界面了。开放聊天室的别样操作,都与普通群组操作一样。

       用户:

进入开放聊天室

若是任何极端用户都足以投入开放聊天室。作为开发者,大家得以通过通过特定条件检索到持有开放聊天室,然后允许用户擅自加盟,其演示代码为:

conversation.join(new AVIMConversationCallback(){
  @Override
  public void done(AVException e) {
    if (null != e) {
      // 出错了:(
    } else {
      // 成功,此时可以进入聊天界面了。。。
      Intent intent = new Intent(currentActivity, ChatActivity.class);
      Intent.putExtra(“conversation”, conversation);
      currentActivity.startActivity(intent);
    }
  }
});

       URL:http://&lt;网站
URL>/_api/web/siteusers(@v)?@v='<登录名>’

询问在线人数

通过 AVIMConversation.getMemberCount()
方法能够实时查询开放聊天室的在线人数。示例代码如下:

conversation.getMemberCount(new AVIMConversationMemberCountCallback(){
  @Override
  public void done(Integer memberCount, AVException e) {
    if (null != e) {
      // 出错了:(
    } else {
      // 成功,此时 memberCount 的数值就是实时在线人数
    }
  }
});

       角色:

签字和安全

为了知足开发者对权力和表明的渴求,LeanCloud
还规划了操作签名的机制。大家可以在 LeanCloud
应用控制毕尔巴鄂的「设置」->「应用选项」->「聊天推送」下边勾选「聊天服务签约认证」来启用签名(强烈推荐那样做)。启用后,所有的用户登录、对话创制/到场、约请成员、踢出成员等操作都急需验证签名,那样开发者就可以对新闻进行充足的支配。

客户端那边究竟该怎样利用啊?大家只要求落成 SignatureFactory
接口,然后在用户登录从前,把这一个接口的实例赋值给 AVIMClient
即可(AVIMClient.setSignatureFactory(factory))。

设定了 signatureFactory 之后,对于要求鉴权的操作,LeanCloud IM SDK
与劳务器端通信的时候都会带上应用自己生成的 Signature 新闻,LeanCloud
云端会利用 app 的 masterKey 来表明音信的有效性,保险聊天渠道的安全。

对此 SignatureFactory 接口,大家只需求落成那多少个函数即可:

  /**
   * 实现一个基础签名方法 其中的签名算法会在SessionManager和AVIMClient(V2)中被使用
   */
  public Signature createSignature(String peerId, List<String> watchIds) throws SignatureException;

  /**
   * 实现AVIMConversation相关的签名计算
   */
  public Signature createConversationSignature(String conversationId, String clientId,
      List<String> targetIds, String action) throws SignatureException;

createSignature
函数会在用户登录的时候被调用,createConversationSignature
会在对话成立/参与、邀约成员、踢出成员等操作时被调用。

您需求做的就是按照前文所述的署名算法已毕签约,其中 Signature
申明如下:

public class Signature {
  public List<String> getSignedPeerIds();
  public void setSignedPeerIds(List<String> signedPeerIds);

  public String getSignature();
  public void setSignature(String signature);

  public long getTimestamp();
  public void setTimestamp(long timestamp);

  public String getNonce();
  public void setNonce(String nonce);
}

里头三个特性分别是:

  • signature 签名
  • timestamp 时间戳,单位秒
  • nonce 随机字符串 nonce
  • signedPeerIds 放行的 clientId 列表,v2 中已经抛开不用

下边的代码体现了按照 LeanCloud
云代码进行签字时,客户端的完成部分,你可以参照它来成功自己的逻辑完成:

public class KeepAliveSignatureFactory implements SignatureFactory {
 @Override
 public Signature createSignature(String peerId, List<String> watchIds) {
   Map<String,Object> params = new HashMap<String,Object>();
   params.put("self_id",peerId);
   params.put("watch_ids",watchIds);

   try{
     Object result =  AVCloud.callFunction("sign",params);
     if(result instanceof Map){
       Map<String,Object> serverSignature = (Map<String,Object>) result;
       Signature signature = new Signature();
       signature.setSignature((String)serverSignature.get("signature"));
       signature.setTimestamp((Long)serverSignature.get("timestamp"));
       signature.setNonce((String)serverSignature.get("nonce"));
       return signature;
     }
   }catch(AVException e){
     throw (SignatureFactory.SignatureException) e;
   }
   return null;
 }

  @Override
  public Signature createConversationSignature(String convId, String peerId, List<String> targetPeerIds,String action){
   Map<String,Object> params = new HashMap<String,Object>();
   params.put("self_id",peerId);
   params.put("group_id",convId);
   params.put("group_peer_ids",targetPeerIds);
   params.put("action",action);

   try{
     Object result = AVCloud.callFunction("group_sign",params);
     if(result instanceof Map){
        Map<String,Object> serverSignature = (Map<String,Object>) result;
        Signature signature = new Signature();
        signature.setSignature((String)serverSignature.get("signature"));
        signature.setTimestamp((Long)serverSignature.get("timestamp"));
        signature.setNonce((String)serverSignature.get("nonce"));
        return signature;
     }
   }catch(AVException e){
     throw (SignatureFactory.SignatureException) e;
   }
   return null;
  }
}

LeanCloud IM SDK
专注做好底层的通信服务,有越多可以定制化的地点,譬如说:

  • 账户种类和 IM 系统是分离的;
  • 信息成为离线推送的时候,推送内容开发者是足以定制的;
  • 经过 web hook,开发者可以对音信举行愈来愈多处理;
  • 闲聊进度中经过音讯鉴权机制,开发者可以有越多控制;

因为缺乏 UI
组件,实事求是地讲在新用户接入开销可能稍高,但是在事情规模扩充、产品必要变多以后,相信我们会越来越喜欢
LeanCloud 那种自由灵活的利用体验,以及稳定火速的劳动品质。

       URL:http://&lt;网站
URL>/_api/web/roledefinitions(<角色定义
ID>)

      (4)对用户配置文件的操作

       URL:http://&lt;网站
url>/_api/sp.userprofiles.peoplemanager

      (5)对字段的操作

       URL:http://&lt;网站 url>/_api/web/fields(‘<字段 id>’) 或 http://&lt;网站 url>/_api/web/lists(guid'<列表 id>’)/fields(‘<字段 id>’)

       上边大家介绍了列表,文件夹等品种 API
的地点构造,接下去大家看看那些请求地址中允许的查询参数都有何:       

       (1)$select 参数

       如 SQL 中 Select 的施用格局,那里的 $select
也是确定请求重回的结果中须要包涵怎么样字段,使用办法是:_api/web/lists/getByTitle(‘Books’)/items?$select=Author,Title,ISBN,那样我们就会在得到Books这些列表时,只收获小编,书名和ISBN多少个有效字段。

       (2)$filter 参数

       如 SQL 中 Where 的选择办法,那里的 $filter
是用来筛选数据的筛选标准,使用形式是:_api/web/lists/getByTitle(‘Books’)/items?$filter=Author
eq ‘马克 吐温’,那样我们就能取到 Books 列表中,Author 为 Mark 特温的数据。

       (3)$expand 参数

      
那个参数用于指定再次回到联接列表中的哪些投射字段。使用办法是:_api/web/lists/getByTitle(‘Books’)/items?$select=Title,PublishedBy/Name&$expand=PublishedBy,那里的投射字段是
PublishedBy。

       (4)$top 参数

      
这些参数用户指定重返结果集中的前N项,使用形式是:_api/web/lists/getByTitle(‘Books’)/items?$top=2,这样大家就会回到这一个结果集中的前两项(如不足两项则赶回全体多少)。

       (5)$skip 参数

      
这些参数用于在结果集中跳过指定数量的项,而回到剩余的项。使用方法是:_api/web/lists/getByTitle(‘Books’)/items?$skip=2,这样我们就会在回来结果中跳过前两项而回到其他的项,如结果不足两项,则赶回空结果集。

       (6)$orderby 参数

       这些参数用于对结果集进行排序,如 SQL
中运用形式,分为升序和降序二种办法,以 asc 和 desc
关键字来标识。使用办法是:_api/web/lists/getByTitle(‘Books’)/items?$orderby=ID
desc。那样我们回去的结果集,就会以 ID 为规范来降序排列。 

       下边那张表,涵盖了 SharePoint REST API
中大概拥有的查询条件和数字、字符等的可比关键字。例如 $filter=Author eq
‘马克 特温’,就是筛选 Author 等于 马克 吐温 的项,而 Author ne ‘Mark特温’,则是筛选不等的项。那是本着字符串的可比操作,而针对性数字的则囊括 
lt(小于)、le(小于等于)、gt(大于)、ge(大于等于)、eq(等于)和
ne(不对等)。还有针对日期和岁月的可比符,见表中表明。

       必发365bifa0000 1 

       最终还论及到一个授权的难点,如前方所说,远程访问都需求先授权才能访问资源。大家得以经过
OAuth 授权的方法来成功应用授权和身份验证。将得到的 OAuth
访问令牌加入到请求标头中。那里大家不做详细介绍了。关于
API本身的利用进程,和其余 API
没什么差异,那里就不做详细介绍了。就是一个发出请求,得到重回结果(Atom或JSON),然后解析结果的历程。

       那样大家就把 SharePoint REST API
的构成和主导的拔取方法介绍完了,希望对大家在 Windows 商店应用中运用
SharePoint REST API 有所帮忙,谢谢。

       

 

 

 

 

     

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图