一、背景
在做钉钉企业会话异步发送的接口时,按照官方文档,
(1)我先封装好了请求参数类:
AsyncMessage.
java
(2)封装好http请求工具类(用的钉钉官方给的示例代码):
(3)然后写了一个企业会话异步发送业务类:AsyncSendMessageService.java
(4)最后是测试类:AsyncSendMessageServiceTest.java
源码在后面
二、异常
请求参数中明明有method,可以发送请求后,却报了一个Missing method的错误;
错误信息如下:
com.alibaba.fastjson.JSONException: syntax error, pos 1, json : <?xml version="1.0" encoding="utf-8" ?><error_response><code>21</code><msg>Missing method</msg><sub_msg>http传入的参数加入method字段</sub_msg><request_id>12jrtcf50tcfa</request_id></error_response><!--top010178205069.n.et2-->
at com.alibaba.fastjson.parser.DefaultJSONParser.parse(DefaultJSONParser.java:1394)
at com.alibaba.fastjson.parser.DefaultJSONParser.parse(DefaultJSONParser.java:1287)
at com.alibaba.fastjson.JSON.parse(JSON.java:139)
at com.alibaba.fastjson.JSON.parse(JSON.java:130)
at com.alibaba.fastjson.JSON.parseObject(JSON.java:206)
at com.ray.dingtalk.util.HttpHelper.httpPost(HttpHelper.java:115)
at com.ray.dingtalk.service.message.asyncsend.AsyncSendMessageService.sendMessage(AsyncSendMessageService.java:58)
at com.ray.dingtalk.test.AsyncSendMessageServiceTest.testSendNotice(AsyncSendMessageServiceTest.java:21)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:678)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
package com.ray.dingtalk.model.message.asyncsend;
/**@desc :
*
* 参考文档地址:https://open-doc.dingtalk.com/docs/
* doc.htm?spm=a219a.7629140.0.0.hZSBgV&treeId=385&
* articleId=28915&docType=2
*
* @author: shirayner
* @date : 2017年10月13日 下午1:53:40
*/
public class AsyncMessage {
//1.公共参数
//必须 ,API接口名称
private String method;
//必须 ,钉钉提供的授权Token
private String session;
//必须,时间戳,格式为yyyy-MM-dd HH:mm:ss,时区为GMT+8,例如:2015-01-01 12:00:00。
//淘宝API服务端允许客户端请求最大时间误差为10分钟。
private String timestamp;
//必须,API协议版本,可选值:2.0。
private String v;
//2.请求参数
private String msgtype;
//必须,微应用的id
private Number agent_id;
//必须,与msgtype对应的消息体,参见文档
private String msgcontent;
//否
private String [] userid_list;
//否
private Boolean to_all_user;
public String getMethod() {
return method;
}
public void setMethod(String method) {
this.method = method;
}
public String getSession() {
return session;
}
public void setSession(String session) {
this.session = session;
}
public String getTimestamp() {
return timestamp;
}
public void setTimestamp(String timestamp) {
this.timestamp = timestamp;
}
public String getV() {
return v;
}
public void setV(String v) {
this.v = v;
}
public String getMsgtype() {
return msgtype;
}
public void setMsgtype(String msgtype) {
this.msgtype = msgtype;
}
public Number getAgent_id() {
return agent_id;
}
public void setAgent_id(Number agent_id) {
this.agent_id = agent_id;
}
public String getMsgcontent() {
return msgcontent;
}
public String[] getUserid_list() {
return userid_list;
}
public void setUserid_list(String[] userid_list) {
this.userid_list = userid_list;
}
public Boolean getTo_all_user() {
return to_all_user;
}
public void setTo_all_user(Boolean to_all_user) {
this.to_all_user = to_all_user;
}
public void setMsgcontent(String msgcontent) {
this.msgcontent = msgcontent;
}
}
package com.ray.dingtalk.service.message.asyncsend;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.ray.dingtalk.model.message.asyncsend.AsyncMessage;
import com.ray.dingtalk.util.HttpHelper;
/**@desc : 主动发送异步消息
*
* @author: shirayner
* @date : 2017年10月13日 下午1:39:46
*/
public class AsyncSendMessageService {
private static final String SEND_ASYNCSENDMESSAGE_URL="https://eco.taobao.com/router/rest";
public void sendMessage(String accessToken) throws Exception{
//1.封装请求参数
String method="dingtalk.corp.message.corpconversation.asyncsend";
String session =accessToken;
String timestamp= String.valueOf( System.currentTimeMillis() / 1000 );
String v="2.0";
String msgtype ="text";
Number agent_id=128838526;
String msgcontent="发送异步消息测试";
Boolean to_all_user=true;
AsyncMessage cca=new AsyncMessage();
cca.setMethod(method);
cca.setSession(session);
cca.setTimestamp(timestamp);
cca.setV(v);
cca.setMsgtype(msgtype);
cca.setAgent_id(agent_id);
cca.setMsgcontent(msgcontent);
cca.setTo_all_user(to_all_user);
//1.准备POST请求参数
Object data=JSON.toJSON(cca); //将javaBean 转为 json
System.out.println(data);
//2.获取请求url
String url=SEND_ASYNCSENDMESSAGE_URL;
//3.发起POST请求,获取返回结果
JSONObject jsonObject=HttpHelper.httpPost(url, data);
System.out.println("jsonObject:"+jsonObject.toString());
//4.解析结果,获取
if (null != jsonObject) {
//5.错误消息处理
if (0 != jsonObject.getInteger("errcode")) {
int errCode = jsonObject.getInteger("errcode");
String errMsg = jsonObject.getString("errmsg");
throw new Exception("error code:"+errCode+", error message:"+errMsg);
}
}
}
}
/**@desc :
*
* @author: shirayner
* @date : 2017年10月13日 下午2:36:27
*/
public class AsyncSendMessageServiceTest {
@Test
public void testSendNotice() throws Exception {
String accessToken=AuthHelper.getAccessToken(Env.CORP_ID, Env.CORP_SECRET);
AsyncSendMessageService asm=new AsyncSendMessageService();
asm.sendMessage(accessToken);
}
}
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。