经理看我比较闲,给我安排了这个技术点儿,一开始就直奔钉钉开发者文档去了,了解下来非常简单.我大概封装了三个类,分别是,获取accesstoken方法类/创建会话类/发送消息类
钉钉对于这个流程是这样的:
工具类httphelper:
public class HttpHelper {
public static JSONObject httpGet(String url) throws OApiException{
HttpGet httpGet = new HttpGet(url);
CloseableHttpResponse response = null;
CloseableHttpClient httpClient = HttpClients.createDefault();
RequestConfig requestConfig = RequestConfig.custom().
setSocketTimeout(2000).setConnectTimeout(2000).build();
httpGet.setConfig(requestConfig);
try {
response = httpClient.execute(httpGet, new BasicHttpContext());
if (response.getStatusLine().getStatusCode() != 200) {
System.out.println("request url failed, http code=" + response.getStatusLine().getStatusCode()
+ ", url=" + url);
return null;
}
HttpEntity entity = response.getEntity();
if (entity != null) {
String resultStr = EntityUtils.toString(entity, "utf-8");
JSONObject result = JSON.parseObject(resultStr);
if (result.getInteger("errcode") == 0) {
// result.remove("errcode");
// result.remove("errmsg");
return result;
} else {
System.out.println("request url=" + url + ",return value=");
System.out.println(resultStr);
int errCode = result.getInteger("errcode");
String errMsg = result.getString("errmsg");
throw new OApiException(errCode, errMsg);
}
}
} catch (IOException e) {
System.out.println("request url=" + url + ", exception, msg=" + e.getMessage());
e.printStackTrace();
} finally {
if (response != null) try {
response.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
public static JSONObject httpPost(String url, Object data) throws OApiException {
HttpPost httpPost = new HttpPost(url);
CloseableHttpResponse response = null;
CloseableHttpClient httpClient = HttpClients.createDefault();
RequestConfig requestConfig = RequestConfig.custom().
setSocketTimeout(2000).setConnectTimeout(2000).build();
httpPost.setConfig(requestConfig);
httpPost.addHeader("Content-Type", "application/json");
try {
StringEntity requestEntity = new StringEntity(JSON.toJSONString(data), "utf-8");
httpPost.setEntity(requestEntity);
response = httpClient.execute(httpPost, new BasicHttpContext());
if (response.getStatusLine().getStatusCode() != 200) {
System.out.println("request url failed, http code=" + response.getStatusLine().getStatusCode()
+ ", url=" + url);
return null;
}
HttpEntity entity = response.getEntity();
if (entity != null) {
String resultStr = EntityUtils.toString(entity, "utf-8");
JSONObject result = JSON.parseObject(resultStr);
if (result.getInteger("errcode") == 0) {
result.remove("errcode");
result.remove("errmsg");
return result;
} else {
System.out.println("request url=" + url + ",return value=");
System.out.println(resultStr);
int errCode = result.getInteger("errcode");
String errMsg = result.getString("errmsg");
throw new OApiException(errCode, errMsg);
}
}
} catch (IOException e) {
System.out.println("request url=" + url + ", exception, msg=" + e.getMessage());
e.printStackTrace();
} finally {
if (response != null) try {
response.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
public static JSONObject uploadMedia(String url, File file) throws OApiException {
HttpPost httpPost = new HttpPost(url);
CloseableHttpResponse response = null;
CloseableHttpClient httpClient = HttpClients.createDefault();
RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(2000).setConnectTimeout(2000).build();
httpPost.setConfig(requestConfig);
HttpEntity requestEntity = MultipartEntityBuilder.create().addPart("media",
new FileBody(file, ContentType.APPLICATION_OCTET_STREAM, file.getName())).build();
httpPost.setEntity(requestEntity);
try {
response = httpClient.execute(httpPost, new BasicHttpContext());
if (response.getStatusLine().getStatusCode() != 200) {
System.out.println("request url failed, http code=" + response.getStatusLine().getStatusCode()
+ ", url=" + url);
return null;
}
HttpEntity entity = response.getEntity();
if (entity != null) {
String resultStr = EntityUtils.toString(entity, "utf-8");
JSONObject result = JSON.parseObject(resultStr);
if (result.getInteger("errcode") == 0) {
// 成功
result.remove("errcode");
result.remove("errmsg");
return result;
} else {
System.out.println("request url=" + url + ",return value=");
System.out.println(resultStr);
int errCode = result.getInteger("errcode");
String errMsg = result.getString("errmsg");
throw new OApiException(errCode, errMsg);
}
}
} catch (IOException e) {
System.out.println("request url=" + url + ", exception, msg=" + e.getMessage());
e.printStackTrace();
} finally {
if (response != null) try {
response.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
public static JSONObject downloadMedia(String url, String fileDir) throws OApiException {
HttpGet httpGet = new HttpGet(url);
CloseableHttpResponse response = null;
CloseableHttpClient httpClient = HttpClients.createDefault();
RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(2000).setConnectTimeout(2000).build();
httpGet.setConfig(requestConfig);
try {
HttpContext localContext = new BasicHttpContext();
response = httpClient.execute(httpGet, localContext);
RedirectLocations locations = (RedirectLocations) localContext.getAttribute(HttpClientContext.REDIRECT_LOCATIONS);
if (locations != null) {
URI downloadUrl = locations.getAll().get(0);
String filename = downloadUrl.toURL().getFile();
System.out.println("downloadUrl=" + downloadUrl);
File downloadFile = new File(fileDir + File.separator + filename);
FileUtils.writeByteArrayToFile(downloadFile, EntityUtils.toByteArray(response.getEntity()));
JSONObject obj = new JSONObject();
obj.put("downloadFilePath", downloadFile.getAbsolutePath());
obj.put("httpcode", response.getStatusLine().getStatusCode());
return obj;
} else {
if (response.getStatusLine().getStatusCode() != 200) {
System.out.println("request url failed, http code=" + response.getStatusLine().getStatusCode()
+ ", url=" + url);
return null;
}
HttpEntity entity = response.getEntity();
if (entity != null) {
String resultStr = EntityUtils.toString(entity, "utf-8");
JSONObject result = JSON.parseObject(resultStr);
if (result.getInteger("errcode") == 0) {
// 成功
result.remove("errcode");
result.remove("errmsg");
return result;
} else {
System.out.println("request url=" + url + ",return value=");
System.out.println(resultStr);
int errCode = result.getInteger("errcode");
String errMsg = result.getString("errmsg");
throw new OApiException(errCode, errMsg);
}
}
}
} catch (IOException e) {
System.out.println("request url=" + url + ", exception, msg=" + e.getMessage());
e.printStackTrace();
} finally {
if (response != null) try {
response.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
}
获取accesstoken:
需要参数:codeID和corpsecret
请求url:https://oapi.dingtalk.com/gettoken?corpid="+corpid+"&corpsecret="+corpsecret (这里需要把参数拼接到url)
发送上面的url,得到一个json串,然后成功的时候会获取到accesstoken,这个accesstoken我了解到的是它的可用时长为2个小时,过期后再次发送请求.
核心代码部分:
public static String getAccessToken(String corpid,String corpsecret ){
HttpHelper h=new HttpHelper();
//获取accesstoken
JSONObject accesstoken = null;
String accesstoken2 = "";
String urlaccesstoken ="https://oapi.dingtalk.com/gettoken?corpid="+corpid+"&corpsecret="+corpsecret;
System.out.println(urlaccesstoken);
try{
accesstoken=h.httpGet(urlaccesstoken);
JSONObject accesstoken1 = new JSONObject(accesstoken);
accesstoken2 = (String) accesstoken1.get("access_token");
System.out.println(accesstoken2);
}catch(OApiException e) {
//TODOAuto-generated catch block
e.printStackTrace();
}
return accesstoken2;
}
创建会话:
用到两个以上的userid
请求url="https://oapi.dingtalk.com/chat/create?access_token="+accesstoken
这里需要用到一个httphelper这个工具类,这个是提前封装好的.通过这个类,可用使参数在不用拼接到url的情况下,携带参数请求.
核心代码:
public static String getChatId(String accesstoken){
HttpHelper h=new HttpHelper();
JSONObject image=new JSONObject();
//创建会话
String url="https://oapi.dingtalk.com/chat/create?access_token="+accesstoken;
String[] str1 = {"XXX","XXX"};//(xxx代表员工工号)
image.put("name","我");
image.put("owner","xxx");//(xxx代表创建人工号)
image.put("useridlist",str1);
//获取会话ID
JSONObject result=null;
JSONObject chatid1 = null;
String chatid="";
try{
result=h.httpPost(url, image);
chatid1 = new JSONObject(result);
chatid = (String) chatid1.get("chatid");
}catch(OApiException e) {
//TODOAuto-generated catch block
e.printStackTrace();
}
return chatid;
}
发送会话:
参数:一些需要编辑的文字消息
url1="https://oapi.dingtalk.com/chat/send?access_token="+accesstoken
核心代码:
public static JSONObject sendtext(String accesstoken,String chatid){
HttpHelper h=new HttpHelper();
JSONObject image=new JSONObject();
JSONObject text=new JSONObject();
JSONObject result1=null;
//发送群消息
String url1="https://oapi.dingtalk.com/chat/send?access_token="+accesstoken;
//发送文本消息
text.put("content","你好,你有待审批的项目,请及时完成审批");
image.put("chatid", chatid);
image.put("msgtype", "text");
image.put("text", text);
try{
result1=h.httpPost(url1, image);
}catch(OApiException e) {
e.printStackTrace();
}
return result1;
}
效果图: