使用VBA结合可变URI调用REST API更新Jira问题时无法访问URI的技术求助
问题排查与修正方案
我帮你排查了代码里的几个关键问题,这些应该是导致无法访问Jira URI和获取不到响应的核心原因:
主要问题点
- 请求方法错误:更新Jira问题必须使用
PUT请求,而不是你当前用的POST(POST是创建新问题的请求方法)。 - IssueAddress拼接错误:你当前的URL拼接方式完全不符合VBA语法,字符串连接应该用
&,双引号转义需要用两个双引号"",错误的拼接会导致请求地址无效。 - JSON格式与字符串拼接错误:构造的IssueData存在多处语法问题,比如多余的逗号、引号嵌套错误,导致Jira无法解析请求体。
- 缺少请求状态校验:没有检查HTTP请求的状态码,无法判断请求是否成功,也无法捕获错误信息。
修正后的完整代码
Sub updateIssue() Dim id As String Dim rng As Range Dim rs As Long Dim JiraService As MSXML2.XMLHTTP60 Dim ResponseTxt As String Dim Summary As String Dim Description As String Dim Project As Variant Dim IssueType As String Dim IssueData As String Dim Path As Variant Dim UN As String Dim PW As String ' 统一变量名大小写 Dim Assignee As String Dim sEncbase64Auth As String Dim IssueKey As String Dim IssueURL As String ' 修正变量名 ' 获取账号密码 UN = Sheet2.Range("A4").Value PW = Sheet2.Range("A5").Value ' 统一变量名 ' 循环处理选中的每一行 For Each rng In Selection.Rows rs = rng.Row ' 读取单元格数据 Summary = ActiveSheet.Cells(rs, 4).Value Description = ActiveSheet.Cells(rs, 5).Value IssueType = ActiveSheet.Cells(rs, 9).Value Assignee = ActiveSheet.Cells(rs, 8).Value IssueKey = ActiveSheet.Cells(rs, 14).Value ' 1. 修正Jira问题URL的拼接方式 IssueURL = "https://your-domain.atlassian.net/jira/rest/api/latest/issue/" & IssueKey ' 2. 修正JSON构造,确保格式正确 IssueData = "{""update"": {}, " & _ """fields"": {" & _ """parent"": {""key"": ""TEST""}, " & _ """summary"": """ & Replace(Summary, """", "\""") & """, " & _ """description"": """ & Replace(Description, """", "\""") & """, " & _ """assignee"": {""name"": """ & Assignee & """}" & _ "}}" ' 生成Base64授权字符串 sEncbase64Auth = CommonFunction.EncodeBase64(UN & ":" & PW) ' 输出调试信息(可选) ActiveSheet.Range("G6").Value = IssueData & " | Auth Basic: " & sEncbase64Auth ' 3. 使用PUT请求更新问题 Set JiraService = New MSXML2.XMLHTTP60 With JiraService .Open "PUT", IssueURL, False .SetRequestHeader "Content-Type", "application/json" .SetRequestHeader "Accept", "application/json" .SetRequestHeader "X-Atlassian-Token", "nocheck" .SetRequestHeader "Authorization", "Basic " & sEncbase64Auth ' 发送请求 .Send IssueData ' 4. 检查请求状态并获取响应 If .Status >= 200 And .Status < 300 Then ResponseTxt = "更新成功!状态码: " & .Status ' 如果需要返回的问题详情,可以用.ResponseText ' ResponseTxt = .ResponseText Else ResponseTxt = "更新失败!状态码: " & .Status & vbCrLf & "错误信息: " & .ResponseText End If End With ' 将响应写入单元格 ActiveSheet.Cells(rs, 8).Value = ResponseTxt ' 释放对象 Set JiraService = Nothing Next End Sub
关键修改说明
- 请求方法改为PUT:Jira的API明确要求更新问题使用
PUT请求,这是最核心的错误。 - 修正URL拼接:直接用
&连接URL和IssueKey,避免了引号拼接错误,确保请求地址有效。 - 修复JSON格式:
- 移除了多余的逗号;
- 用
Replace函数转义了Summary和Description中的双引号,避免JSON语法错误; - 规范了字符串拼接的引号嵌套,确保生成的JSON符合Jira API要求。
- 增加状态码检查:通过
.Status属性判断请求是否成功,同时捕获错误信息,方便调试。 - 统一变量名:将
Pw改为PW,保持变量声明和赋值的一致性。
额外建议
- 确保你的Jira账号有修改问题的权限;
- 可以先将生成的IssueData复制到JSON校验工具中,确认格式是否正确;
- 如果仍然有问题,可以查看Jira的API日志,或者输出
.Status和.ResponseText的详细信息来定位问题。
内容的提问来源于stack exchange,提问作者Aly
相关产品推荐
相关产品推荐

