接收';操作中止错误';通过vba使用jira api向现有问题添加标签时,即使标签已成功添加
我试图通过VBA使用JIRARESTAPI向JIRA中的现有问题添加标签。我可以成功登录、获取会话id/cookie、查找问题并向问题添加注释,但当我尝试添加标签时,在Excel中收到以下错误消息 然而,有趣的是,这个标签实际上是加上去的 宏之前: 宏之后: 我就是无法解释或弄清楚到底发生了什么。我已经浏览了互联网(特别是Atlassian论坛),发现了一些页面上的例子,这些例子表明我正确地发送了这个请求,但我仍然收到这个运行时错误。在这里的许多事情中,有一些事情是我读过/做过的,试图弄明白这一点接收';操作中止错误';通过vba使用jira api向现有问题添加标签时,即使标签已成功添加,vba,excel,jira,jira-rest-api,Vba,Excel,Jira,Jira Rest Api,我试图通过VBA使用JIRARESTAPI向JIRA中的现有问题添加标签。我可以成功登录、获取会话id/cookie、查找问题并向问题添加注释,但当我尝试添加标签时,在Excel中收到以下错误消息 然而,有趣的是,这个标签实际上是加上去的 宏之前: 宏之后: 我就是无法解释或弄清楚到底发生了什么。我已经浏览了互联网(特别是Atlassian论坛),发现了一些页面上的例子,这些例子表明我正确地发送了这个请求,但我仍然收到这个运行时错误。在这里的许多事情中,有一些事情是我读过/做过的,试图弄明
- 我在本期的
上做了一个/editmeta
,以获取GET
字段的详细信息,该字段产生了这个labels
labels":{ "required":false, "schema":{ "type":"array", "items":"string", "system":"labels" }, "name":"Labels", "autoCompleteUrl":"http://jira.company.local:8080/rest/api/1.0/labels/suggest?query=", "operations":[ "add", "set", "remove" ] }
- 我使用的方法(在这个问题的底部)是根据用户Patrick Patrick的评论改编的
- 我已经阅读了有关编辑数据的文档
- 我知道我应该使用PUT而不是POST
- 具体阅读如何更新标签,并遵循中的语法,然后尝试响应中描述的新方法
- 最后,我在Atlassian社区发现了一堆与这类问题有关的bug。从
选项显式
次吉拉()
Dim ASNumber作为字符串,供应商作为字符串,IssueLink作为字符串
Dim myJIRA作为新的CLSjirrest
和myJIRA
.UserName=“*******”
.Password=“*******”
.URL=”http://jira.company.local:8080"
如果.Login=False,则退出Sub
.GetLastSummary
IssueLink=.GetIssueLink'看起来他们给了你一个特定的错误代码。这很好,因为您可以忽略该错误,但仍可以处理其他可能的错误-如果该错误号不是“PostExportComment”操作的特定错误,则将自己设置为局部变量以跟踪错误发生的位置:
On Error GoTo ErrHandler
'...
currentStep = "PostExportComment"
.PostExportComment '<-Throws run-time error 'Operation aborted'
currentStep = "Logout"
.Logout
End With
CleanExit:
'clean up here
Exit Sub
ErrHandler:
'"Operation aborted" error is a false positive, see https://jira.atlassian.com/browse/JRA-27929
If currentStep = "PostExportComment" And Err.Number = -2147467260 Then
Resume Next
Else
'handle other possible runtime errors here
Resume CleanExit
End If
如果错误在API端,并且毫无意义,…为什么不直接接受它呢?(在出错时用将失败的行换行,然后在出错时继续下一步
{code}转到0
)我想我可以,只是那样对我来说有点脏,你知道吗?难道不应该有一种更干净的方法吗?我不知道Jira的API,但是你能用最少的代码来重新编程错误吗?也就是说,试着将行为与周围的一切隔离开来。如果它能工作,但仍然抛出那个错误,我想这个错误是在Jira一边的,而不是你的。这正是我所做的。我浏览并注释掉了周围的代码,它只是添加标签的.send
调用中的错误。我的意思是,根据我发布的链接中的bug问题,这似乎是Jira意识到的一个问题。真糟糕,他们什么都没做。啊,真聪明!再说一次,当它来自您时总是这样:)只有一个问题,您将API包装在类模块中并以这种方式处理错误是什么意思?我之所以这么问,是因为现在我已经在一个类模块中拥有了所有API功能(请参阅我的clsJIRARest类模块)。这就是你的意思吗?我刚刚意识到我忘了将它清楚地标记为类模块,我将立即修复它。不管怎样,你建议我如何做更好/更干净的选择?@CaffeinatedCoder我添加了一个包装示例谢谢您的示例!
Public Function Login() As Boolean
Login = False
With JiraAuth
.Open "POST", sURL & "/rest/auth/1/session", False
.setRequestHeader "Content-Type", "application/json"
.setRequestHeader "Accept", "application/json"
.send " {""username"" : """ & sJIRAUserID & """, ""password"" : """ & sJIRAPass & """}"" '*** HTTP-Request senden"
sErg = .responseText
If .Status = "200" Then
sCookie = "JSESSIONID=" & Mid(sErg, 42, 32) & "; Path=/" & sPfad
Login = True
End If
End With
End Function
Public Function GetLastSummary()
Dim myRegEx As Object: Set myRegEx = CreateObject("vbscript.regexp")
myRegEx.Global = True
myRegEx.Pattern = "as\/([0-9]{4,5}).+?(?=\-)" '<-Working
With JiraService
.Open "GET", sURL & "/rest/api/2/search?jql=assignee=mhill+order+by+lastViewed&now&maxResults=5", False
.setRequestHeader "Content-Type", "application/json"
.setRequestHeader "Accept", "application/json"
.setRequestHeader "Set-Cookie", sCookie '*** see Create a "Cookie"
.send
Set sRestAntwort = myRegEx.Execute(.responseText)
Sup = sRestAntwort(0)
ANum = sRestAntwort(0).Submatches(0)
myRegEx.Pattern = "self"":""(.+?(?=""))"
myRegEx.Global = False
Set sRestAntwort = myRegEx.Execute(.responseText)
sIssueLink = sRestAntwort(0).Submatches(0)
End With
End Function
'The comment posts fine below, but the label is what causes the error
Public Function PostExportComment() As Boolean
With JiraService
.Open "POST", sIssueLink & "/comment", False
.setRequestHeader "Content-Type", "application/json"
.setRequestHeader "Accept", "application/json"
.setRequestHeader "Set-Cookie", sCookie '*** see Create a "Cookie"
Dim sExportComment As String: sExportComment = "Full Export Requested - Awaiting Download Email"
.send " {""body"" : """ & sExportComment & """}"" '*** HTTP-Request senden"
'
' PostExportComment = IIf(.Status = "201", True, False)
.Open "PUT", sIssueLink, False
.setRequestHeader "Content-Type", "application/json"
.setRequestHeader "Accept", "application/json"
.setRequestHeader "Set-Cookie", sCookie '*** see Create a "Cookie"
Dim sExportingLabel As String: sExportingLabel = "Exporting"
'===============Errors on next line==================
.send " { ""update"": { ""labels"": [{""add"": """ & sExportingLabel & """}] } }"" '*** HTTP-Request senden" '(See below photo for error message)
Debug.Print .Status & "|" & .statusText
End With
End Function
On Error GoTo ErrHandler
'...
currentStep = "PostExportComment"
.PostExportComment '<-Throws run-time error 'Operation aborted'
currentStep = "Logout"
.Logout
End With
CleanExit:
'clean up here
Exit Sub
ErrHandler:
'"Operation aborted" error is a false positive, see https://jira.atlassian.com/browse/JRA-27929
If currentStep = "PostExportComment" And Err.Number = -2147467260 Then
Resume Next
Else
'handle other possible runtime errors here
Resume CleanExit
End If
Private wrapped As My3rdPartyThing
Public Enum MeaningfulError
ERR_FoobarNotInitialized = vbObjectError + 42
ERR_WrongCredentials
ERR_Whatever
End Enum
Private Sub Class_Initialize()
Set wrapped = New My3rdPartyThing
End Sub
Private Sub Class_Terminate()
Set wrapped = Nothing
End Sub
'wraps the "GetFoo" API method
Public Function GetFoo(ByVal bar As Long) As Something
On Error GoTo ErrHandler
Set GetFoo = wrapped.GetFoo(bar)
Exit Function
ErrHandler:
If Err.Number = 12345 Then
Err.Raise ERR_FoobarNotInitialized
Else
Err.Raise ERR_Whatever
End If
End Sub