禅道登录-调用API方式

2023-11-17

禅道提供了API机制方便于大家和其他的系统进行集成,API机制也都是基于http协议的,返回的数据以json格式存储。禅道的API都是需要先登录后才能进行接口调用(登录返回的cookie需要在之后的每次请求中携带用于验证身份信息)。网上关于禅道API调用机制的说明相对较少,接下来我会从postman调用和Java代码两种方式来体现禅道整个登录过程

注意:个别信息比较私密模糊展示不便于公开,请见谅!!

目录

流程图

第一步、获取session

第二步、登录-验证用户身份

第三步、获取cookie

参考代码--doGet()


流程图

第一步、获取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();

补充:Session的作用有哪些?

Session可以在服务器端存储和跟踪用户会话信息,作用如下:

  1. 身份认证和用户登录:服务器可以跟踪用户的登录状态,记录用户的身份认证信息。当用户成功登录后,服务器会创建一个Session,并为该Session分配一个唯一的标识符(Session ID),将该Session ID发送给客户端保存。客户端在后续的请求中携带该Session ID,服务器通过Session ID来识别用户并验证其身份。

  2. 会话状态管理:服务器可以将用户的操作和状态信息存储在Session中,以便在后续的请求中使用。比如,在购物网站中,可以将用户的购物车信息存储在Session中,以便用户在不同页面之间保持购物车的状态。

第二步、登录-验证用户身份

现在我们就可以使用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;
}

补充:Cookie的作用是什么?

  1. 身份认证和用户登录:当用户成功登录后,服务器会在响应中设置一个包含用户身份认证信息的Cookie,并发送给客户端保存。客户端在后续的请求中会携带该Cookie,服务器通过解析Cookie来验证用户的身份。

  2. 会话状态管理:服务器可以在响应中设置一个包含会话状态信息的Cookie,并发送给客户端保存。客户端在后续的请求中会携带该Cookie,服务器通过解析Cookie来获取和管理用户的会话状态。

Cookie和Session的区别是什么?

 

参考代码--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二次开发 - 易软天创开发者中心

总结

注意:个别信息比较私密模糊展示不便于公开,请见谅!!

如果有想要交流的内容欢迎在评论区进行留言,如果这篇文档受到了您的喜欢那就留下你点赞收藏脚印支持一下博主哦~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

禅道登录-调用API方式 的相关文章

  • 使用多个构造函数创建不可变类

    我正在阅读这一页 https docs oracle com javase tutorial essential concurrency imstrat html关于在 Java 中创建不可变类 并决定根据页面上概述的规范修改我正在编写的类
  • 有效地查找正则表达式的所有重叠匹配项

    这是后续与 java 正则表达式匹配的所有重叠子字符串 https stackoverflow com q 11303309 244526 有没有办法让这段代码更快 public static void allMatches String
  • @PreUpdate 不适用于 Spring Data JPA

    我有一个实体 Entity EntityListeners MyEntityListener class class MyEntity 还有听者 class MyEntityListener PrePersist PreUpdate pub
  • 我想使用 Sequelize 将 MySQL 中的对象数组存储在单个列中

    之前我正在寻找如何使用 Sequelize 在 MySQL 中插入对象数组 然后我找到了一种直接插入数组的解决方案 例如 1 2 在单列中 insert into TABLE NAME id marks VALUES 21 1 2 但我正在
  • 删除 servlet 中的 cookie 时出现问题

    我尝试使用以下代码删除 servlet 中的 cookie Cookie minIdCookie null for Cookie c req getCookies if c getName equals iPlanetDirectoryPr
  • firestore快照监听器生命周期和定价之间有什么关系?

    在我的活动中 我有一个字符串列表 这些字符串表示我想要附加快照侦听器的 Firestore 文档 我使用 Acivity ModelView 存储库结构 在活动的 onCreate 中 我向 ViewModelProvider 询问适当的
  • Java:检查给定日期是否在当前月份内

    我需要检查给定的日期是否在当前月份 我编写了以下代码 但 IDE 提醒我getMonth https docs oracle com javase 7 docs api java util Date html getMonth and ge
  • 独占锁定ConcurrentHashMap

    我知道不可能锁定 ConcurrentHashMap 进行独占访问 但是 我找不到原因 是因为构成CHM的 Segment 没有被api公开吗 据推测 如果是的话 客户端代码可以执行 交接 锁定 Cheers 我知道不可能锁定 Concur
  • JSP 标签+ scriptlet。如何启用脚本?

    我有一个使用标签模板的页面 我的 web xml 非常基本 我只是想在页面中运行一些代码 不 我对标签或其他替代品不感兴趣 我想使用不好的做法 scriptlet 哈哈 到目前为止 我收到了 HTTP ERROR 500 错误 Script
  • 您能让 Tomcat 6 stdout.log 文件表现得像 log4j DailyRollingFileAppender 吗?

    我们使用的是 Tomcat 6 的 Windows 安装 默认情况下 我们应用程序的 log4j 输出将转到 catalina base logs stdout log 文件 该日志文件仅在我们重新启动 Tomcat 时滚动 并且文件名始终
  • 如何自定义JProgressBar?

    我正在制作一个启动器 我想要一个自定义的进度栏 我已经做了一些研究 并且可以使用 JavaFX 从未用它做过任何事情 并且可以通过替换 UI 来实现 我正在寻找一个具有圆形边缘和圆形填充的酒吧 像这样的事情 package gui impo
  • grails 上的同步块在 Windows 上有效,但在 Linux 上无效

    我有一个 grails 应用程序 它依赖于服务中的同步块 当我在 Windows 上运行它时 同步按预期工作 但当我在 ams linux 上运行时 会出现 StaleObjectStateException 该问题在以下示例中重现 cla
  • Java G1 GC 处理引用对象运行缓慢

    我已经在 J ava 上运行了计数器 它24小时工作 每秒点击通过100次左右 白天 GC 处理时间从 20 60 毫秒缓慢上升到 10000 60000 毫秒 然后下降到 20 60 毫秒 这种模式不时地重复 从 GC 日志中我发现 GC
  • 发送 Microsoft Graph 请求事件返回 400

    我能够通过将 JSON 请求发布到https graph microsoft com v1 0 me calendar events https graph microsoft com v1 0 me calendar events 我已经
  • Java中的DRY原则[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我一直在读关于DRY https en wikipedia org wiki Don 27t repeat yourself原则 虽然看起来
  • 是什么原因导致“对象不是声明类的实例”? [复制]

    这个问题在这里已经有答案了 可能的重复 使用反射调用方法时 为什么会出现 对象不是声明类的实例 https stackoverflow com questions 7202988 why do i get object is not an
  • Java SE + Spring Data + Hibernate

    我正在尝试使用 Spring Data Hibernate 启动 Java SE 应用程序 并且到目前为止已经完成了以下操作 配置文件 Configuration PropertySource classpath hibernate pro
  • Java泛型类型

    当我有一个界面时 public interface Foo
  • 使用 Android 的 Mobile Vision API 扫描二维码

    我跟着这个tutorial http code tutsplus com tutorials reading qr codes using the mobile vision api cms 24680关于如何构建可以扫描二维码的 Andr
  • 如何使用 Spring AOP 建议静态方法?

    在执行类的静态方法之前和之后需要完成一些日志记录 我尝试使用 Spring AOP 来实现这一点 但它不起作用 而对于正常方法来说它起作用 请帮助我理解如何实现这一点 如果可以使用注释来完成 那就太好了 也许您应该在使用 Spring AO

随机推荐

  • 2020-09-06

    Elasticsearch Elasticsearch 简称ES 是一个可分布式的实时搜索和分析引擎 一个建立在全文搜索引擎 一个建立在全文搜索引擎Apache Lucence基础上的搜索引擎 它不仅可以进行全文搜素 还可以进行以下工作 分
  • centos7 Docker化应用体验

    centos7 Docker化应用体验 环境分析 WordPress运行环境需要如下软件的支持 PHP 5 6 或 更新版本 MySQL 5 6 或 更新版本 Apache 和 mod rewrite 模块 下载应用镜像 下载mariadb
  • RobotFramework-ride自动化操作教程

    一丶启动robotframework 启动RIDE 打开用例文件 找到文件位置 gt 选择文件 查看资源文件 确保用例所需资源文件当前目录都存在 三 用例编写 执行 新增用例 2 执行用例 勾选要执行的用例 点击run tests 或者 F
  • 浅谈漏洞及其分类

    浅谈漏洞及其分类 一 漏洞概念 漏洞是指一个系统上硬件 软件 协议等具体实现或系统安全策略上存在的弱点或缺陷 系统对特定威胁攻击或危险事件的敏感性 或进行攻击的威胁作用的可能性 这些缺陷 错误或不合理之处可能被有意或无意地利用 可以使攻击者
  • python中unexpected indent报错的解决办法

    python中unexpected indent报错的解决办法 在我们初步学习pyton的时候 由于对python语言的学习掌握不充分 则会导致所编写的代码 运行时候报错 比如 容易报错的unexpected indent问题 下面举例说明
  • Mybatis多对多查询+PageHelpler分页问题

    多对多查询 说明 tb user用户表 tb role角色表 tb user role用户角色关联表 实现表数据的多对多查询并返回 使用PageHelper对查询结果分页 用户表 Data NoArgsConstructor AllArgs
  • 想学好python?这18条学习技巧你一定要掌握。能甩别人两条街。

    在这篇文章中 我们将讨论最常用的python技巧 大多数这些技巧都是我在日常工作中使用过的简单的Trick 我觉得好东西就是要拿出来和大家一起分享 闲话少说 我们直接开始吧 处理用户的多个输入 有时我们需要从用户那里获得多个输入 以便使用循
  • 手把手教你在Tensorflow实现BEGAN 达到惊人的人脸图像生成效果

    导读 本文是基于谷歌大脑 Google Brain 发表在 arXiv 的最新论文 BEGAN 边界平衡生成对抗网络 实现的 该工作针对GAN 面临的一些难题 例如如何衡量收敛 如何控制分布多样性以及如何维持鉴别器和生成器之间的平衡等问题
  • Lock锁

    Lock实现提供比使用synchronized方法和语句可以获得的更广泛的锁定操作 它们允许更灵活的结构化 可能具有完全不同的属性 并且可以支持多个相关联的对象Condition 1 传统的synchronized package cn d
  • c语言(从入门到放弃?NONONO,LET我们一步一步刨析,会发现其中蕴含的乐趣)

    大家刚入门的时候通常会觉得c语言怎么怎么难学 听别人说指针多么多么难懂 深入学习的人的头发如何如何的稀少 然而我们只需要一步一步了解 一步一步刨析 会发现学习c语言也是具有许多乐趣的 接下来我们正式展开对C语言的简单了解咯 目录 一 让我们
  • Qt-信号和槽中使用自定义数据类型

    QT如果要在信号中使用自定义类型 需要首先调用qRegisterMetaType函数 语句类似 qRegisterMetaType
  • NOIP1998普及组复赛第二题 贰的幂方 解题报告

    问题描述 任何一个正整数都可以用 2 的幂次方表示 例如 137 27 23 20 在这里我们约定次方用括号来表示 即 ab 可表示为 a b 由上面叙述可知 137 又可以表示为 2 7 2 3 2 0 进一步 7 22 2 20 2 2
  • 游戏开发unity 3d知识系列:(一)用mesh绘制一个三角形网格

    国内讲解这些基础的感觉比较少 在youtube上看到一个比较好的视频 https www youtube com watch v eJEpeUH1EMg
  • Python抓取网页中的超链接以及其文本

    0 准备工作 读入网页加以解析抓取 需要用到的软件包是 requests html 我们此处并不需要这个软件包的全部功能 只读入其中的 HTMLSession 就可以 from requests html import HTMLSessio
  • 微信小程序富文本标签rich-text的使用

    wxml 接收对象数组
  • 解锁编程世界的魔法密码:探索算法的奥秘与应用

    一个程序员一生中可能会邂逅各种各样的算法 但总有那么几种 是作为一个程序员一定会遇见且大概率需要掌握的算法 今天就来聊聊这些十分重要的 必抓 算法吧 一 引言 算法是解决问题和优化程序性能的核心 它是一系列精确指令 将输入转换为输出 并在计
  • org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'multipart/form-data;bounda

    今天在编写SpringBoot 文件上传遇到这样的错误 org springframework web HttpMediaTypeNotSupportedException Content type multipart form data
  • 乐高科技系列搭建指南 pdf_玩转乐高机器人系列柒——乐高滑雪机器人、陀螺发射器...

    EV3机器人 玩转乐高机器人系列柒 机器人系列作品更新的比较少 一起来搭建几个好玩的吧 春天到了 你有没有跑出去踏春 春天到了 是不是应该搭建一点和春天相关的作品呢 感觉是可以来想想了 搭建好以后可以后期来分享 乐高EV3滑雪机器人 乐高滑
  • cad新手必练300图_27张CAD新手练习图!每天练一张,坚持一个月“小白”变“大神”...

    点击蓝字 室内设计苑 汇集全球室内设计最新资讯 很多刚接触CAD的朋友们一定有这样一个烦恼 就是刚掌握了一些基本的操作可是却不知道要拿什么练手 学会了还得会实操 不然也都是白搭 必须要多练才能熟能生巧 但是在网络上搜的练习图要么就是广告 要
  • 禅道登录-调用API方式

    禅道提供了API机制方便于大家和其他的系统进行集成 API机制也都是基于http协议的 返回的数据以json格式存储 禅道的API都是需要先登录后才能进行接口调用 登录返回的cookie需要在之后的每次请求中携带用于验证身份信息 网上关于禅