禅道提供了API机制方便于大家和其他的系统进行集成,API机制也都是基于http协议的,返回的数据以json格式存储。禅道的API都是需要先登录后才能进行接口调用(登录返回的cookie需要在之后的每次请求中携带用于验证身份信息)。网上关于禅道API调用机制的说明相对较少,接下来我会从postman调用和Java代码两种方式来体现禅道整个登录过程
注意:个别信息比较私密模糊展示不便于公开,请见谅!!
流程图
第一步、获取session
首先调用禅道提供的获取SessionID的API
postman:
接口返回的data中的sessionID对应的value值就是我们需要获取的sessionID值,用于后续禅道登录验证
Java代码:
//调用禅道接口获取sessionID String session = doGet("http://127.0.0.1/zentao/api-getSessionID.json", null, false); // json解析器-GSON JsonParser parse = new JsonParser(); //将接口返回的字符串解析成json格式 JsonObject jsonSession = (JsonObject) parse.parse(session); //将json格式中的data解析出来 JsonObject jsonObj = (JsonObject) parse.parse(jsonSession.get("data").getAsJsonPrimitive().getAsString()); //获取key为sessionID的值 String sessionID = jsonObj.get("sessionID").toString();
第二步、登录-验证用户身份
现在我们就可以使用sessionID来用户身份验证进行登录了,登录的时候需要提供用户名和密码,变量名如下:account,password
postman:
将上一步获取到的sessionID放到url地址中,在Params以key、value的形式放置登陆的用户名和密码
Java代码:
//存储登录需要使用到的信息 Map map = new HashMap(); //账号 map.put("account", "account"); //密码 map.put("password", "password"); //sessionID map.put("zentaosid", "sessionID"); //登录url String loginResult = doGet("http://127.0.0.1" +"//zentao/user-login-XXXX=.json", map, true);
第三步、获取cookie
登录成功之后我们把登录返回的cookie获取出来,用于调用其他API的携带信息了
说明:在解析响应体信息时,
postman:
在上一步登录之后返回的Cookie中包含了名为【zentaosid】的key、value,其中zentaosid为cookie名,相应的value为值,我们只需要获取出来便可以进行其他API的调用了
Java代码:
/** * 用来存取cookies信息的变量. */ private static CookieStore cookieStore; //获取登录过后的cookie 存入 cookieStore对象 public static String GetCookies(HttpGet get) throws IOException { String result = null; try { if (null == cookieStore) { cookieStore = new BasicCookieStore(); } //获取响应 CloseableHttpClient httpClient = HttpClients.custom().setDefaultCookieStore(cookieStore).build(); //执行请求 CloseableHttpResponse response = httpClient.execute(get); result = EntityUtils.toString(response.getEntity(), "utf-8"); // 获取cookies信息 List<Cookie> cookies = cookieStore.getCookies(); //解析出zentaosid for (Cookie cookie : cookies) { String name = cookie.getName(); String value = cookie.getValue(); if (name.equals("zentaosid")) { Constant.ZENTAOID = value; } } } catch (IOException e) { e.printStackTrace(); } return result; }
参考代码--doGet()
作用:执行url请求调用
//向指定url发起请求,可携带参数,并选择是否携带cookie public static String doGet(String url, Map params, boolean isCookie) { //获取httpclient客户端 CloseableHttpClient httpclient = HttpClients.createDefault(); String resultString = ""; CloseableHttpResponse response = null; try { URIBuilder builder = new URIBuilder(url); if (null != params) { for (Object key : params.keySet()) { String keyStr = key.toString(); String result = params.get(key).toString(); builder.setParameter(keyStr, result); } } //Get请求 HttpGet get = new HttpGet(builder.build()); //判断是否需要传入cookie //是:调用GetCookies()方法获取cookie //否:执行请求 if (!isCookie) { //执行请求 response = httpclient.execute(get); //200表示接口调用成功 if (200 == response.getStatusLine().getStatusCode()) { //HttpEntity表示http的request和resposne实体,它由消息头和消息体组成。 //从HttpEntity中可以获取http请求头和回应头,也可以获取http请求体和回应体信息。 HttpEntity entity = response.getEntity(); resultString = EntityUtils.toString(entity, "utf-8"); } } else { //调用GetCookies()方法获取cookie resultString = GetCookies(get); } } catch (Exception e) { e.printStackTrace(); } finally { if (null != response) { try { response.close(); } catch (IOException e) { e.printStackTrace(); } } if (null != httpclient) { try { httpclient.close(); } catch (IOException e) { e.printStackTrace(); } } } return resultString; }
参考链接:zentaoPHP二次开发简介 - zentaoPHP二次开发 - 易软天创开发者中心
总结
注意:个别信息比较私密模糊展示不便于公开,请见谅!!