让您的 Android 应用也能促膝交谈(第二版)必发365乐趣网投手机版

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 方法来删除数据。

登录

假诺聊天发起方名叫 Tom,为直观起见,大家利用用户名来作为 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# 基础代码的光阴。

建立对话

假若大家要跟「鲍勃」这一个用户展开聊天,大家先成立一个会话,代码如下:

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);
    }
  }
});

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

如你所见,大家创立一个会话的时候,指定了成员(汤姆 和
鲍伯)和一个附加的品质({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());
    }
  }
});

好了,这样一条音讯就发送过去了。不过难题来了,对于「Bob」而言,他怎么才能收到别人发给她的新闻呢?

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

新闻接收

在 鲍伯 这一端,要能接收到音信,需求如下几步:

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奥迪(Audi)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
    }
  }
});

注意:
获取历史新闻的时候,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 为 马克 特温的多少。

       (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(不等于)。还有针对性日期和时间的比较符,见表中表明。

       必发365乐趣网投手机版 1 

       最终还涉嫌到一个授权的标题,如前方所说,远程访问都要求先授权才能访问资源。大家得以透过
OAuth 授权的措施来达成应用授权和身份验证。将得到的 OAuth
访问令牌参加到请求标头中。那里大家不做详细介绍了。关于
API本身的利用进程,和别的 API
没什么差距,那里就不做详细介绍了。就是一个发出请求,得到重返结果(Atom或JSON),然后解析结果的进度。

       那样大家就把 SharePoint REST API
的重组和着力的选取办法介绍完了,希望对我们在 Windows 商店应用中行使
SharePoint REST API 有所帮助,谢谢。

       

 

 

 

 

     

发表评论

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

网站地图xml地图