范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

JiraAPI的踩坑记

  我本来是想写篇文章,吐槽一下jira的api的,但是发现最终jira api,很多地方又让我学到了一些新知识。有些方面真的是没见过这么标准使用的。可能是我之前孤陋寡闻啦,所以本文的内容不仅仅是讲jira的坑, 还有一些是jira本身优良的品性,不仅让我学到了一些知识,也让我对规范有了新的理解。 本文的内容算是对我最近这段时间以来对接jira API的经验总结,希望能对各位有所帮助。  没有中文
  这个是对我来说最大的困难,本身我的英文水平不好之前,阅读文档或者说是一些文章都是直接一键翻译,但是碰到jira的API文档就有点蒙逼了。 本来我以为在国内有很多公司都在用jira, 这里面少不了的API接口进行功能性的封装,肯定会有中文的文档结果经过几次尝试搜索之后,我终于确认jira API是没有中文文档的。
  我使用的一键翻译软件是浏览器自带的尝试过一些,他们总是会把接口请求路径中的英文单词也翻译成汉字,这简直就是不能看。 虽然如此,我还是需要中文翻译和英文原文对照着看,因为有些地方翻译成中文之后语序不是那么通顺。总体来说,没有中文文档对App的接入还是有挺大影响的,因为需要不断地去对照着英文原文和理解翻译之后的结果。
  在我搜索中文文档的过程中,我看到网上有很多人对API的实现进行了分享,对我来说还是有点大帮助的。 但内容比较少,仅限于两三个特别常用的API。 没有人完整的翻译过jira API的文档,然后我发现了一个巨坑的事情: jira App文档分嗯多个版本,基本上每一个版本的基拉就对应一个版本的API文档,我没有仔细去看这里面的区别,但是我觉得一个版本一个文档,着实有点坑了。 大家如果有机会对接jira API文档,到时候一定要首先确认jira的版本。  HTTPcode
  在jira API文档中,http协议响应状态码有很多使用。在我之前的工作经历中,很少注意到http响应状态码这个数据。 因为大多数情况都是成功的话,返回200,不成功的话也是返回200(通过业务状态码来区分不同原因), 只有在接口请求失败,或者说服务器故障的时候会处理一下400和500系列的响应状态码。 在对接Jira API文档的过程中,我遇到了很多种之前没有接触过的200系列的http协议响应状态码。Jira API 是通过http,响应状态码来表示业务处理状态,他并没有使用业务状态码。 所以,在对接的过程中,需要单独处理每个接口的http响应状态码。
  在POST和PUT全球方法的接口, 很少能看到200的状态响应码。 下面分享一下,我常见到的201和204状态响应码的标准规范。  201 Created
  请求已经被实现,而且有一个新的资源已经依据请求的需要而建立,且其 URI 已经随Location 头信息返回。假如需要的资源无法及时建立的话,应当返回 "202 Accepted"。  204 No Content
  服务器成功处理了请求,但不需要返回任何实体内容,并且希望返回更新了的元信息。响应可能通过实体头部的形式,返回新的或更新后的元信息。如果存在这些头部信息,则应当与所请求的变量相呼应。如果客户端是浏览器的话,那么用户浏览器应保留发送了该请求的页面,而不产生任何文档视图上的变化,即使按照规范新的或更新后的元信息应当被应用到用户浏览器活动视图中的文档。由于204响应被禁止包含任何消息体,因此它始终以消息头后的第一个空行结尾。  响应不统一
  在之前文章一起吐槽接口文档中, 我吐槽了一下,接口文档最坑的就是响应不统一,没想到在对接Jira文档的时候就出现了特别多这样的实践机会。我曾经一度怀疑Jira文档是不是故意这么做的,因为各个接口的响应结果。均为json形式,但是最外层的json响应结构。有点1000个接口有1000个响应的即视感。
  我之前写项目测试框架的时候,都会对响应结果进行统一的json格式处理,但是对于Jira的api就没有办法使用统一的格式处理,每一个接口都需要进行单独的处理。这无疑也增加了工作量。下面分享我遇到的几种响应结构。  {     "issues": [         {             "id": "10000",             "key": "TST-24",             "self": "http://www.example.com/jira/rest/api/2/issue/10000"         },         {             "id": "10001",             "key": "TST-25",             "self": "http://www.example.com/jira/rest/api/2/issue/10001"         }     ],     "errors": [] } {     "id": "10000",     "key": "TST-24",     "self": "http://www.example.com/jira/rest/api/2/issue/10000" }
  下面这种就属于比较霸王级别的难看。一个响应结构体去。表示编辑之后的issues的状态。结果没想到在JSON对象中包了这么多层。为了让文章能缩短一下,我把里数组重复的内容给删除了,但是还是有这么复杂的响应结构体,简直就是丧心病狂!  {     "id": "https://docs.atlassian.com/jira/REST/schema/issue-update#",     "title": "Issue Update",     "type": "object",     "properties": {         "transition": {             "title": "Transition",             "type": "object",             "properties": {                 "id": {                     "type": "string"                 },                 "name": {                     "type": "string"                 },                 "to": {                     "title": "Status",                     "type": "object",                     "properties": {                         "statusColor": {                             "type": "string"                         },                         "description": {                             "type": "string"                         },                         "iconUrl": {                             "type": "string"                         },                         "name": {                             "type": "string"                         },                         "id": {                             "type": "string"                         },                         "statusCategory": {                             "title": "Status Category",                             "type": "object",                             "properties": {                                 "id": {                                     "type": "integer"                                 },                                 "key": {                                     "type": "string"                                 },                                 "colorName": {                                     "type": "string"                                 },                                 "name": {                                     "type": "string"                                 }                             },                             "additionalProperties": false                         }                     },                     "additionalProperties": false                 },                 "fields": {                     "type": "object",                     "patternProperties": {                         ".+": {                             "title": "Field Meta",                             "type": "object",                             "properties": {                                 "required": {                                     "type": "boolean"                                 },                                 "schema": {                                     "title": "Json Type",                                     "type": "object",                                     "properties": {                                         "type": {                                             "type": "string"                                         },                                         "items": {                                             "type": "string"                                         },                                         "system": {                                             "type": "string"                                         },                                         "custom": {                                             "type": "string"                                         },                                         "customId": {                                             "type": "integer"                                         }                                     },                                     "additionalProperties": false                                 },                                 "name": {                                     "type": "string"                                 },                                 "autoCompleteUrl": {                                     "type": "string"                                 },                                 "hasDefaultValue": {                                     "type": "boolean"                                 },                                 "operations": {                                     "type": "array",                                     "items": {                                         "type": "string"                                     }                                 },                                 "allowedValues": {                                     "type": "array",                                     "items": {}                                 }                             },                             "additionalProperties": false,                             "required": [                                 "required"                             ]                         }                     },                     "additionalProperties": false                 }             },             "additionalProperties": false         },         "fields": {             "type": "object",             "patternProperties": {                 ".+": {}             },             "additionalProperties": false         },         "update": {             "type": "object",             "patternProperties": {                 ".+": {                     "type": "array",                     "items": {                         "title": "Field Operation",                         "type": "object"                     }                 }             },             "additionalProperties": false         },         "historyMetadata": {             "title": "History Metadata",             "type": "object",             "properties": {                 "type": {                     "type": "string"                 },                 "description": {                     "type": "string"                 },                 "descriptionKey": {                     "type": "string"                 },                 "activityDescription": {                     "type": "string"                 },                 "activityDescriptionKey": {                     "type": "string"                 },                 "emailDescription": {                     "type": "string"                 },                 "emailDescriptionKey": {                     "type": "string"                 },                 "actor": {                     "$ref": "#/definitions/history-metadata-participant"                 },                 "generator": {                     "$ref": "#/definitions/history-metadata-participant"                 },                 "cause": {                     "$ref": "#/definitions/history-metadata-participant"                 },                 "extraData": {                     "type": "object",                     "patternProperties": {                         ".+": {                             "type": "string"                         }                     },                     "additionalProperties": false                 }             },             "additionalProperties": false         },         "properties": {             "type": "array",             "items": {                 "title": "Entity Property",                 "type": "object",                 "properties": {                     "key": {                         "type": "string"                     },                     "value": {}                 },                 "additionalProperties": false             }         }     },     "definitions": {         "history-metadata-participant": {             "title": "History Metadata Participant",             "type": "object",             "properties": {                 "id": {                     "type": "string"                 },                 "displayName": {                     "type": "string"                 },                 "displayNameKey": {                     "type": "string"                 },                 "type": {                     "type": "string"                 },                 "avatarUrl": {                     "type": "string"                 },                 "url": {                     "type": "string"                 }             },             "additionalProperties": false         }     },     "additionalProperties": false } 包装过度
  在通常所用到的接口文档中的接口参数,一般都是通过key value形式去传参。比较复杂的,可能会用到数组。但是在对接Jira文档的时候,我发现完全不能以之前的思维惯性去理解Jira API文档中的接口参数传递方式。如果说通常接口参数通过JSON包装一层的话,那么Jira文档的接口参数就是里三层外三层。下面我通过几个实例给大家真实的再现一下鸡爪文档中接口参数的复杂性。  {     "update": {         "worklog": [             {                 "add": {                     "timeSpent": "60m",                     "started": "2011-07-05T11:05:00.000+0000"                 }             }         ]     },     "fields": {         "project": {             "id": "10000"         },         "summary": "something"s wrong",         "issuetype": {             "id": "10000"         },         "assignee": {             "name": "homer"         },         "reporter": {             "name": "smithers"         },         "priority": {             "id": "20000"         },         "labels": [             "bugfix",             "blitz_test"         ],         "timetracking": {             "originalEstimate": "10",             "remainingEstimate": "5"         },         "security": {             "id": "10000"         },         "versions": [             {                 "id": "10000"             }         ],         "environment": "environment",         "description": "description",         "duedate": "2011-03-11",         "fixVersions": [             {                 "id": "10001"             }         ],         "components": [             {                 "id": "10000"             }         ],         "customfield_30000": [             "10000",             "10002"         ],         "customfield_80000": {             "value": "red"         },         "customfield_20000": "06/Jul/11 3:25 PM",         "customfield_40000": "this is a text field",         "customfield_70000": [             "jira-administrators",             "jira-software-users"         ],         "customfield_60000": "jira-software-users",         "customfield_50000": "this is a text area. big text.",         "customfield_10000": "09/Jun/81"     } } {     "startAt": 0,     "maxResults": 1,     "total": 1,     "comments": [         {             "self": "http://www.example.com/jira/rest/api/2/issue/10010/comment/10000",             "id": "10000",             "author": {                 "self": "http://www.example.com/jira/rest/api/2/user?username=fred",                 "name": "fred",                 "displayName": "Fred F. User",                 "active": false             },             "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque eget venenatis elit. Duis eu justo eget augue iaculis fermentum. Sed semper quam laoreet nisi egestas at posuere augue semper.",             "updateAuthor": {                 "self": "http://www.example.com/jira/rest/api/2/user?username=fred",                 "name": "fred",                 "displayName": "Fred F. User",                 "active": false             },             "created": "2016-09-27T09:43:02.795+0000",             "updated": "2016-09-27T09:43:02.795+0000",             "visibility": {                 "type": "role",                 "value": "Administrators"             }         }     ] }
  以上两个是我用遇到的比较麻烦的两个接口的传参方式,大家看起来可能会比较复杂。也有点儿迷惑,但其实这两个接口都不算。最复杂的,因为他案例中这些参数的值大部分是可以不传的。Jira API文档中 最让我感觉到不爽的,还不是这种里山城外三成的包装方式, 而是同一个参数,可能会出现在多个包装结构中。 而且这些包装结构的作用范围并没有在文档中标识出来,导致我想去查一个参数,并不知道两个地方现在多个地方到底哪个地方有用只能去一各一各的尝试,虽然对接文档的工作已经完成了,但是对于文档中所标记的参数以及传参格式部分字段依然稀里糊涂。反正功能已经实现啦,就先不去管它啦。  Demo错误
  接口文档中最难以让人忍受的就是接口文档中存在着硬性错误。本来对接接口文档已经是一个比较麻烦的事情了。如果文档中出现一些硬性的错误。会让我付出更多的时间和精力去纠正这些错误,如果再碰到非常复杂的包装格式,就更让人恼火了。回到刚才提到过的Jira api文档,有非常多个版本,如果文档出现错误,修复起来肯定也是比较多的。我一度认为他这个文档就是通过工具直接生成的。跟源码中的文档标记很相似。
  下面分享一条文档中的错误,这是一个接口传参格式的Demo。乍一看其实没什么问题,但是这其实并不是JSON的标准格式。在我们阅读文档的时候首先就,首先就是要解析出这个中接口传参格式的JSON展示,我们才能知道具体在JSON好在传参的时候,在哪一层去传什么样的参数。  {"update":{"summary":[{"set":"Bug in business logic"}],"components":[{"set":""}],"timetracking":[{"edit":{"originalEstimate":"1w 1d","remainingEstimate":"4d"}}],"labels":[{"add":"triaged"},{"remove":"blocker"}]},"fields":{"summary":"This is a shorthand for a set operation on the summary field","customfield_10010":1,"customfield_10000":"This is a shorthand for a set operation on a text custom field"},"historyMetadata":{"type":"myplugin:type","description":"text description","descriptionKey":"plugin.changereason.i18.key","activityDescription":"text description","activityDescriptionKey":"plugin.activity.i18.key","actor":{"id":"tony","displayName":"Tony","type":"mysystem-user","avatarUrl":"http://mysystem/avatar/tony.jpg","url":"http://mysystem/users/tony"},"generator":{"id":"mysystem-1","type":"mysystem-application"},"cause":{"id":"myevent","type":"mysystem-event"},"extraData":{"keyvalue":"extra data","goes":"here"}},"properties":[{"key":"key1","value":"properties" : "can be set at issue create or update time"},{"key":"key2","value":"and" : "there can be multiple properties"}]}
  其实问题出现在最后一个 "properties":[{"key":"key1","value":"properties" : "can be set at issue create or update time"},{"key":"key2","value":"and" : "there can be multiple properties"}]  ,后面的can be  其实是对这个参数的描述,不知道怎么到了接口的传参Demo里面了。着实让人头大。 中英混排
  Jira的api文档都是英文版的,我一度怀疑他并不重视中国区用户,但是当我看到某些接口的字段值的时候,我一下子震惊了,原来他的字段值还是中英混排的。一下子有点儿不知所措。如图所示:
  jira上issue状态
  issue状态中居然有中文。真是让我感动的痛哭涕零,这都什么玩意儿。  POST PUT
  在我之前的工作当中,主要接触的还是get和post接口。对于其他HTTP请求方式并不十分了解,也不太清楚这其中的规范。一直以来的概念就是获取数据用get,修改数据用post。但是在接触Jira API文档的过程中,我仔细地看了看post和PUT的区别。总结如下:  创建用POST,修改PUT  POST非幂等,PUT幂等
  在传参格式上,post和put都一样。设置请求entity的方式也是一样的,在Java代码中是通用的,原因在于 org.apache.http.client.methods.HttpPut  和org.apache.http.client.methods.HttpPost  都继承于抽象类org.apache.http.client.methods.HttpEntityEnclosingRequestBase  。这个小知识点我又重新学习了一遍。
  Have Fun ~ Tester !

用户还车一周被通知车辆有剐蹭,GOFUN平台一年后竟自动扣款收取维修费极目新闻记者黄永进实习生张洁扫了一辆共享汽车回宿舍,还车后一个星期被应用后台通知车漆有剐蹭,马先生对平台提供的照片提出质疑,表示不予缴费并卸载了该软件,没想到一年后竟被平台通过支付科技助力,展现中国式审美来源人民网人民日报一直以来,科技与舞台艺术都有着紧密的联结,在舞台美术方面有着尤为突出的体现。从古希腊罗马剧场中代表了当时最高科技水平的声场设计和半圆形舞台的切割工艺,到电灯的发明美国超一半人ampampquot打零工ampampquot?多家科技巨头最新宣布,这些员工可永久居家办公哪些股票可布局?打工人逐渐变成了打零工人!互联网的普及与各类工具的涌现,使得职员们远程办公逐渐成为趋势,美国科技巨头们已纷纷做出表率,多家公司宣布允许部分职工永久远程办公。在经济下行的冲击下,企业华为智选发布乐奇智能电动滑板车,支持鸿蒙系统,首发2399华为的智选品牌在中国推出了一款全新产品。名字为LEQI智能电动滑板车,拥有一些创新功能以及很酷的设计。它的标价为2399元,目前已上架。这款滑板车的主要功能之一是蓝牙模块和对鸿蒙系AppleWatch7评测一款独立且实用的智能手表凭借更纤薄的边框和更大的显示屏,AppleWatch7是迄今为止最实用的独立智能手表。苹果最新款智能手表AppleWatchSeries7是对Series6的增量升级,保持18小时好赛道,好公司,赶紧上车今天给大家介绍一家跟我们生活息息相关的人工智能公司科大讯飞。科大讯飞长期从事语音及语言自然语言理解机器学习推理及自主学习等人工智能核心技术研究并始终保持国际前沿技术水平,致力于让机冬天告别冰水,TCL推出智能水龙头,3秒速热仅69元冬天已经临近,各地都在降温。刷牙洗脸洗碗洗菜将逐渐变成一种考验,冰冷刺骨的自来水是冬天的噩梦。有条件的家庭用上了热水器的热水,没有这种条件的怎么办呢?换一个速热水龙头即可。TCL就2022年五大技术彰显智慧生活新趋势人间的烟火气千年来始终如一,但技术的发展却日新月异,给人类带来的影响也日益复杂。美国福布斯双周刊杂志网站在近日的报道中,为我们列出了2022年五大技术趋势,包括人工智能(AI)无处美国在行动,韩国会是下一个日本了01hr一边是美国科技巨头苹果打破双11购物节的世界最高销售额纪录,单品牌在双11实现了销售额破百亿的神话纪录风光无限。一边却是韩国科技巨头三星苹果在全球范围内最大的竞争对手却被逼华为将在17日晚举行发布会,Mate50系列要官宣了吗?今天华为官方微博发布了一条消息,称在11月17日1930将举行一场发布会,发布会的主题为全场景智慧生活。据悉在本次发布会中,华为会发布至少三种类型的产品,分别是运动手表系列,平板系高端手机销量洗牌华为排名垫底,小米MIX4第三,苹果包揽冠亚军文Dong审核子扬校对知秋双十一大促的来临,带动了一众消费者们的购买热情。尤其是在电子产品领域,消费者的购买需求更是进一步增加。11月10日,京东方面公布了11月10日京东手机通讯
字节跳动回应取消下午茶房补等福利消息不实IT之家12月30日消息,据Tech星球,网传字节跳动内部开始讨论取消下午茶,取消房补等福利,预计春节后执行。字节跳动相关负责人回应不实。上个月据第一财经报道,字节跳动公司在昨天召判了,这起长达4年的游戏地图抄袭案迎来二审12月6日,广东省高级人民法院对深圳市腾讯计算机系统有限公司与畅游云端(北京)科技有限公司英雄互娱科技股份有限公司等著作权侵权及不正当竞争纠纷上诉案公开宣判,判决畅游云端公司英雄互除了华为,还有哪家的手机接打电话不断网?感谢您的阅读!除了华为,还有哪家的手机接打电话不断网?我们知道,如果说到信号的话,国产手机的表现确实要比iPhone这些国际手机的表现更好一些。其实,华为应该是在国内手机厂商中信号闪极140W多口充电器发布2C1A接口,支持PD3。1140W输出12月31日消息,闪极昨晚发布了SHARGEEKS140充电头。它支持PD3。1协议的140W快充,提供了多个接口,采用了GaN材料,带来了更小的体积,还可以更换插脚。凭借140W一千多的入门机和七八千的高端旗舰机,有什么区别,是交智商税吗现在智能手机市场种类繁多,但是越来越朝两极化发展,千元机占大多数,高端机又占大多数,而且便宜的手机越来越便宜,从1999到1699再到1499,价格越来越低,而高端手机从3999到黑莓也要停用服务了明年1月4日起,你的手机可能将会报废12月31日消息,近日黑莓宣布,运行BlackBerryOS的老款黑莓手机将会受到很大的影响,黑莓将在下周结束对于BlackBerryOS和BlackBerryPlayBookOSiPhone14Pro将迎5年来最大一次改变我们不能否认一个事实,那就是苹果手机整体配置非常不错而且在实际使用过程中也有着上佳的体验。但是苹果公司在外观设计方面确实是有着不尽人意的地方,一个简单的刘海屏设计,既然能够用上五年中国手机品牌在印度市场已开始下滑我大胆给出一个猜测在印度市场的中国手机品牌2年内将全面崩盘。正如三星败走中国一样,中国品牌也会在印度失势。首先说明,根据2021年三季度Canalys公布的智能手机市场统计报告,印特斯拉上调Model3和ModelY价格近日,特斯拉中国官网显示,Model3后轮驱动版价格调整为26。5652万元,与此前售价相比上调1万元ModelY后轮驱动版价格调整为30。1840万元,与此前售价相比上调2。10马云从万人敬仰的马爸爸到过街老鼠马云到底做了什么?说到中国的电子商务的领导者,你会想到阿里巴巴创始人马云。马云曾经是许多年轻一代企业家的偶像。他总是散发出成功人士的光芒。马云是普通人成为商业领袖的典范。众所周知,在马云创建阿里巴巴百位华商预见2022叶旭群新能源发展将迎来巨大机遇中新经纬12月31日电法国青田同乡会会长叶旭群认为,如今,中国已成为世界上第二大经济体,第一大工业国和第一大货物贸易国以及第一大外汇储备国,中国扮演着越来越重要的角色。同时,叶旭群