package com.easemob.server.example.httpclient.apidemo; import java.net.URL; import com.easemob.server.example.httpclient.vo.ClientSecretCredential; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.easemob.server.example.comm.Constants; import com.easemob.server.example.comm.HTTPMethod; import com.easemob.server.example.comm.Roles; import com.easemob.server.example.httpclient.utils.HTTPClientUtils; import com.easemob.server.example.httpclient.vo.Credential; import com.easemob.server.example.httpclient.vo.EndPoints; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.JsonNodeFactory; import com.fasterxml.jackson.databind.node.ObjectNode; /** * REST API Demo :用户体系集成 REST API HttpClient4.3实现 * * Doc URL: http://www.easemob.com/docs/rest/userapi * * @author Lynch 2014-09-15 * */ public class EasemobIMUsers { private static final Logger LOGGER = LoggerFactory.getLogger(EasemobIMUsers.class); private static final JsonNodeFactory factory = new JsonNodeFactory(false); // 通过app的client_id和client_secret来获取app管理员token private static Credential credential = new ClientSecretCredential(Constants.APP_CLIENT_ID, Constants.APP_CLIENT_SECRET, Roles.USER_ROLE_APPADMIN); public static void main(String[] args) { /** * 注册IM用户[单个] */ ObjectNode datanode = JsonNodeFactory.instance.objectNode(); datanode.put("username","kenshinnuser100"); datanode.put("password", Constants.DEFAULT_PASSWORD); ObjectNode createNewIMUserSingleNode = createNewIMUserSingle(datanode); if (null != createNewIMUserSingleNode) { LOGGER.info("注册IM用户[单个]: " + createNewIMUserSingleNode.toString()); } /** * IM用户登录 */ ObjectNode imUserLoginNode = imUserLogin(datanode.get("username").asText(), datanode.get("password").asText()); if (null != imUserLoginNode) { LOGGER.info("IM用户登录: " + imUserLoginNode.toString()); } /** * 注册IM用户[批量生成用户然后注册] */ String usernamePrefix = "kenshinnuser"; Long perNumber = 10l; Long totalNumber = 100l; ObjectNode createNewIMUserBatchGenNode = createNewIMUserBatchGen(usernamePrefix, perNumber, totalNumber); if (null != createNewIMUserBatchGenNode) { LOGGER.info("注册IM用户[批量]: " + createNewIMUserBatchGenNode.toString()); } /** * 获取IM用户[主键查询] */ String userName = "kenshinnuser100"; ObjectNode getIMUsersByUserNameNode = getIMUsersByUserName(userName); if (null != getIMUsersByUserNameNode) { LOGGER.info("获取IM用户[主键查询]: " + getIMUsersByUserNameNode.toString()); } /** * 重置IM用户密码 提供管理员token */ String username = "kenshinnuser100"; ObjectNode json2 = JsonNodeFactory.instance.objectNode(); json2.put("newpassword", Constants.DEFAULT_PASSWORD); ObjectNode modifyIMUserPasswordWithAdminTokenNode = modifyIMUserPasswordWithAdminToken(username, json2); if (null != modifyIMUserPasswordWithAdminTokenNode) { LOGGER.info("重置IM用户密码 提供管理员token: " + modifyIMUserPasswordWithAdminTokenNode.toString()); } ObjectNode imUserLoginNode2 = imUserLogin(username, json2.get("newpassword").asText()); if (null != imUserLoginNode2) { LOGGER.info("重置IM用户密码后,IM用户登录: " + imUserLoginNode2.toString()); } /** * 添加好友[单个] */ String ownerUserName = username; String friendUserName = "kenshinnuser099"; ObjectNode addFriendSingleNode = addFriendSingle(ownerUserName, friendUserName); if (null != addFriendSingleNode) { LOGGER.info("添加好友[单个]: " + addFriendSingleNode.toString()); } /** * 查看好友 */ ObjectNode getFriendsNode = getFriends(ownerUserName); if (null != getFriendsNode) { LOGGER.info("查看好友: " + getFriendsNode.toString()); } /** * 解除好友关系 **/ ObjectNode deleteFriendSingleNode = deleteFriendSingle(ownerUserName, friendUserName); if (null != deleteFriendSingleNode) { LOGGER.info("解除好友关系: " + deleteFriendSingleNode.toString()); } /** * 删除IM用户[单个] */ ObjectNode deleteIMUserByuserNameNode = deleteIMUserByuserName(userName); if (null != deleteIMUserByuserNameNode) { LOGGER.info("删除IM用户[单个]: " + deleteIMUserByuserNameNode.toString()); } /** * 删除IM用户[批量] */ Long limit = 2l; ObjectNode deleteIMUserByUsernameBatchNode = deleteIMUserByUsernameBatch(limit); if (null != deleteIMUserByUsernameBatchNode) { LOGGER.info("删除IM用户[批量]: " + deleteIMUserByUsernameBatchNode.toString()); } } /** * 注册IM用户[单个] * * 给指定Constants.APPKEY创建一个新的用户 * * @param dataNode * @return */ public static ObjectNode createNewIMUserSingle(ObjectNode dataNode) { ObjectNode objectNode = factory.objectNode(); // check Constants.APPKEY format if (!HTTPClientUtils.match("^(?!-)[0-9a-zA-Z\\-]+#[0-9a-zA-Z]+", Constants.APPKEY)) { LOGGER.error("Bad format of Constants.APPKEY: " + Constants.APPKEY); objectNode.put("message", "Bad format of Constants.APPKEY"); return objectNode; } objectNode.removeAll(); // check properties that must be provided if (null != dataNode && !dataNode.has("username")) { LOGGER.error("Property that named username must be provided ."); objectNode.put("message", "Property that named username must be provided ."); return objectNode; } if (null != dataNode && !dataNode.has("password")) { LOGGER.error("Property that named password must be provided ."); objectNode.put("message", "Property that named password must be provided ."); return objectNode; } try { objectNode = HTTPClientUtils.sendHTTPRequest(EndPoints.USERS_URL, credential, dataNode, HTTPMethod.METHOD_POST); } catch (Exception e) { e.printStackTrace(); } return objectNode; } /** * 注册IM用户[批量] * * 给指定Constants.APPKEY创建一批用户 * * @param dataArrayNode * @return */ public static ObjectNode createNewIMUserBatch(ArrayNode dataArrayNode) { ObjectNode objectNode = factory.objectNode(); // check Constants.APPKEY format if (!HTTPClientUtils.match("^(?!-)[0-9a-zA-Z\\-]+#[0-9a-zA-Z]+", Constants.APPKEY)) { LOGGER.error("Bad format of Constants.APPKEY: " + Constants.APPKEY); objectNode.put("message", "Bad format of Constants.APPKEY"); return objectNode; } // check properties that must be provided if (dataArrayNode.isArray()) { for (JsonNode jsonNode : dataArrayNode) { if (null != jsonNode && !jsonNode.has("username")) { LOGGER.error("Property that named username must be provided ."); objectNode.put("message", "Property that named username must be provided ."); return objectNode; } if (null != jsonNode && !jsonNode.has("password")) { LOGGER.error("Property that named password must be provided ."); objectNode.put("message", "Property that named password must be provided ."); return objectNode; } } } try { objectNode = HTTPClientUtils.sendHTTPRequest(EndPoints.USERS_URL, credential, dataArrayNode, HTTPMethod.METHOD_POST); } catch (Exception e) { e.printStackTrace(); } return objectNode; } /** * 注册IM用户[批量生成用户然后注册] * * 给指定Constants.APPKEY创建一批用户 * * @param usernamePrefix * 生成用户名的前缀 * @param perNumber * 批量注册时一次注册的数量 * @param totalNumber * 生成用户注册的用户总数 * @return */ public static ObjectNode createNewIMUserBatchGen(String usernamePrefix, Long perNumber, Long totalNumber) { ObjectNode objectNode = factory.objectNode(); if (totalNumber == 0 || perNumber == 0) { return objectNode; } System.out.println("你即将注册" + totalNumber + "个用户,如果大于" + perNumber + "了,会分批注册,每次注册" + perNumber + "个"); ArrayNode genericArrayNode = EasemobIMUsers.genericArrayNode(usernamePrefix, totalNumber); if (totalNumber <= perNumber) { objectNode = EasemobIMUsers.createNewIMUserBatch(genericArrayNode); } else { ArrayNode tmpArrayNode = factory.arrayNode(); for (int i = 0; i < genericArrayNode.size(); i++) { tmpArrayNode.add(genericArrayNode.get(i)); // 300 records on one migration if ((i + 1) % perNumber == 0) { objectNode = EasemobIMUsers.createNewIMUserBatch(tmpArrayNode); if(objectNode!=null){ LOGGER.info("注册IM用户[批量]: " + objectNode.toString()); } tmpArrayNode.removeAll(); continue; } // the rest records that less than the times of 300 if (i > (genericArrayNode.size() / perNumber * perNumber - 1)) { objectNode = EasemobIMUsers.createNewIMUserBatch(tmpArrayNode); if(objectNode!=null){ LOGGER.info("注册IM用户[批量]: " + objectNode.toString()); } tmpArrayNode.removeAll(); } } } return objectNode; } /** * 获取IM用户 * * @param userName * 用户主键:username或者uuid * @return */ public static ObjectNode getIMUsersByUserName(String userName) { ObjectNode objectNode = factory.objectNode(); // check Constants.APPKEY format if (!HTTPClientUtils.match("^(?!-)[0-9a-zA-Z\\-]+#[0-9a-zA-Z]+", Constants.APPKEY)) { LOGGER.error("Bad format of Constants.APPKEY: " + Constants.APPKEY); objectNode.put("message", "Bad format of Constants.APPKEY"); return objectNode; } // check properties that must be provided if (StringUtils.isEmpty(userName)) { LOGGER.error("The userName that will be used to query must be provided ."); objectNode.put("message", "The userName that will be used to query must be provided ."); return objectNode; } try { URL userPrimaryUrl = HTTPClientUtils .getURL(Constants.APPKEY.replace("#", "/") + "/users/" + userName); objectNode = HTTPClientUtils.sendHTTPRequest(userPrimaryUrl, credential, null, HTTPMethod.METHOD_GET); } catch (Exception e) { e.printStackTrace(); } return objectNode; } /** * 删除IM用户[单个] * * 删除指定Constants.APPKEY下IM单个用户 * * * @param userName * @return */ public static ObjectNode deleteIMUserByuserName(String userName) { ObjectNode objectNode = factory.objectNode(); // check Constants.APPKEY format if (!HTTPClientUtils.match("^(?!-)[0-9a-zA-Z\\-]+#[0-9a-zA-Z]+", Constants.APPKEY)) { LOGGER.error("Bad format of Constants.APPKEY: " + Constants.APPKEY); objectNode.put("message", "Bad format of Constants.APPKEY"); return objectNode; } try { URL deleteUserPrimaryUrl = HTTPClientUtils.getURL(Constants.APPKEY.replace("#", "/") + "/users/" + userName); objectNode = HTTPClientUtils.sendHTTPRequest(deleteUserPrimaryUrl, credential, null, HTTPMethod.METHOD_DELETE); } catch (Exception e) { e.printStackTrace(); } return objectNode; } /** * 删除IM用户[批量] * * 批量指定Constants.APPKEY下删除IM用户 * * @param limit * @param queryStr * @return */ public static ObjectNode deleteIMUserByUsernameBatch(Long limit) { ObjectNode objectNode = factory.objectNode(); // check Constants.APPKEY format if (!HTTPClientUtils.match("^(?!-)[0-9a-zA-Z\\-]+#[0-9a-zA-Z]+", Constants.APPKEY)) { LOGGER.error("Bad format of Constants.APPKEY: " + Constants.APPKEY); objectNode.put("message", "Bad format of Constants.APPKEY"); return objectNode; } try { URL deleteIMUserByUsernameBatchUrl = HTTPClientUtils.getURL(Constants.APPKEY.replace("#", "/") + "/users" + "?limit=" + limit); objectNode = HTTPClientUtils.sendHTTPRequest(deleteIMUserByUsernameBatchUrl, credential, null, HTTPMethod.METHOD_DELETE); } catch (Exception e) { e.printStackTrace(); } return objectNode; } /** * 重置IM用户密码 提供管理员token * * @param userName * @param dataObjectNode * @return */ public static ObjectNode modifyIMUserPasswordWithAdminToken(String userName, ObjectNode dataObjectNode) { ObjectNode objectNode = factory.objectNode(); // check Constants.APPKEY format if (!HTTPClientUtils.match("^(?!-)[0-9a-zA-Z\\-]+#[0-9a-zA-Z]+", Constants.APPKEY)) { LOGGER.error("Bad format of Constants.APPKEY: " + Constants.APPKEY); objectNode.put("message", "Bad format of Constants.APPKEY"); return objectNode; } if (StringUtils.isEmpty(userName)) { LOGGER.error("Property that named userName must be provided,the value is username of imuser."); objectNode.put("message", "Property that named userName must be provided,the value is username or imuser."); return objectNode; } if (null != dataObjectNode && !dataObjectNode.has("newpassword")) { LOGGER.error("Property that named newpassword must be provided ."); objectNode.put("message", "Property that named newpassword must be provided ."); return objectNode; } try { URL modifyIMUserPasswordWithAdminTokenUrl = HTTPClientUtils.getURL(Constants.APPKEY.replace("#", "/") + "/users/" + userName + "/password"); objectNode = HTTPClientUtils.sendHTTPRequest(modifyIMUserPasswordWithAdminTokenUrl, credential, dataObjectNode, HTTPMethod.METHOD_PUT); } catch (Exception e) { e.printStackTrace(); } return objectNode; } /** * 添加好友[单个] * * @param ownerUserName * @param friendUserName * * @return */ public static ObjectNode addFriendSingle(String ownerUserName, String friendUserName) { ObjectNode objectNode = factory.objectNode(); // check Constants.APPKEY format if (!HTTPClientUtils.match("^(?!-)[0-9a-zA-Z\\-]+#[0-9a-zA-Z]+", Constants.APPKEY)) { LOGGER.error("Bad format of Constants.APPKEY: " + Constants.APPKEY); objectNode.put("message", "Bad format of Constants.APPKEY"); return objectNode; } if (StringUtils.isEmpty(ownerUserName)) { LOGGER.error("Your userName must be provided,the value is username of imuser."); objectNode.put("message", "Your userName must be provided,the value is username of imuser."); return objectNode; } if (StringUtils.isEmpty(friendUserName)) { LOGGER.error("The userName of friend must be provided,the value is username of imuser."); objectNode.put("message", "The userName of friend must be provided,the value is username of imuser."); return objectNode; } try { URL addFriendSingleUrl = HTTPClientUtils.getURL(Constants.APPKEY.replace("#", "/") + "/users/" + ownerUserName + "/contacts/users/" + friendUserName); ObjectNode body = factory.objectNode(); objectNode = HTTPClientUtils.sendHTTPRequest(addFriendSingleUrl, credential, body, HTTPMethod.METHOD_POST); } catch (Exception e) { e.printStackTrace(); } return objectNode; } /** * 删除好友 * * @param ownerUserName * @param friendUserName * * @return */ public static ObjectNode deleteFriendSingle(String ownerUserName, String friendUserName) { ObjectNode objectNode = factory.objectNode(); // check Constants.APPKEY format if (!HTTPClientUtils.match("^(?!-)[0-9a-zA-Z\\-]+#[0-9a-zA-Z]+", Constants.APPKEY)) { LOGGER.error("Bad format of Constants.APPKEY: " + Constants.APPKEY); objectNode.put("message", "Bad format of Constants.APPKEY"); return objectNode; } if (StringUtils.isEmpty(ownerUserName)) { LOGGER.error("Your userName must be provided,the value is username of imuser."); objectNode.put("message", "Your userName must be provided,the value is username of imuser."); return objectNode; } if (StringUtils.isEmpty(friendUserName)) { LOGGER.error("The userName of friend must be provided,the value is username of imuser."); objectNode.put("message", "The userName of friend must be provided,the value is username of imuser."); return objectNode; } try { URL addFriendSingleUrl = HTTPClientUtils.getURL(Constants.APPKEY.replace("#", "/") + "/users/" + ownerUserName + "/contacts/users/" + friendUserName); ObjectNode body = factory.objectNode(); objectNode = HTTPClientUtils.sendHTTPRequest(addFriendSingleUrl, credential, body, HTTPMethod.METHOD_DELETE); } catch (Exception e) { e.printStackTrace(); } return objectNode; } /** * 获取用户所有好友 * * @param ownerUserName * * @return */ public static ObjectNode getFriends(String ownerUserName) { ObjectNode objectNode = factory.objectNode(); // check Constants.APPKEY format if (!HTTPClientUtils.match("^(?!-)[0-9a-zA-Z\\-]+#[0-9a-zA-Z]+", Constants.APPKEY)) { LOGGER.error("Bad format of Constants.APPKEY: " + Constants.APPKEY); objectNode.put("message", "Bad format of Constants.APPKEY"); return objectNode; } if (StringUtils.isEmpty(ownerUserName)) { LOGGER.error("Your userName must be provided,the value is username of imuser."); objectNode.put("message", "Your userName must be provided,the value is username of imuser."); return objectNode; } try { URL addFriendSingleUrl = HTTPClientUtils.getURL(Constants.APPKEY.replace("#", "/") + "/users/" + ownerUserName + "/contacts/users"); ObjectNode body = factory.objectNode(); objectNode = HTTPClientUtils.sendHTTPRequest(addFriendSingleUrl, credential, body, HTTPMethod.METHOD_GET); } catch (Exception e) { e.printStackTrace(); } return objectNode; } /** * IM用户登录 * * @param username * @param password * @return */ public static ObjectNode imUserLogin(String username, String password) { ObjectNode objectNode = factory.objectNode(); // check appKey format if (!HTTPClientUtils.match("^(?!-)[0-9a-zA-Z\\-]+#[0-9a-zA-Z]+", Constants.APPKEY)) { LOGGER.error("Bad format of Appkey: " + Constants.APPKEY); objectNode.put("message", "Bad format of Appkey"); return objectNode; } if (StringUtils.isEmpty(username)) { LOGGER.error("Your username must be provided,the value is username of imuser."); objectNode.put("message", "Your username must be provided,the value is username of imuser."); return objectNode; } if (StringUtils.isEmpty(password)) { LOGGER.error("Your password must be provided,the value is username of imuser."); objectNode.put("message", "Your password must be provided,the value is username of imuser."); return objectNode; } try { ObjectNode dataNode = factory.objectNode(); dataNode.put("grant_type", "password"); dataNode.put("username", username); dataNode.put("password", password); objectNode = HTTPClientUtils.sendHTTPRequest(EndPoints.TOKEN_APP_URL, null, dataNode, HTTPMethod.METHOD_POST); } catch (Exception e) { throw new RuntimeException("Some errors occurred while fetching a token by username and password ."); } return objectNode; } /*************************************************************************************************************************/ /** * 指定前缀和数量生成用户基本数据 * * @param usernamePrefix * @param number * @return */ public static ArrayNode genericArrayNode(String usernamePrefix, Long number) { ArrayNode arrayNode = factory.arrayNode(); for (int i = 0; i < number; i++) { ObjectNode userNode = factory.objectNode(); userNode.put("username", usernamePrefix + "_" + i); userNode.put("password", Constants.DEFAULT_PASSWORD); arrayNode.add(userNode); } return arrayNode; } }