You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

关键修改说明

  1. 请求方法改为PUT:Jira的API明确要求更新问题使用PUT请求,这是最核心的错误。
  2. 修正URL拼接:直接用&连接URL和IssueKey,避免了引号拼接错误,确保请求地址有效。
  3. 修复JSON格式:
    • 移除了多余的逗号;
    • 用Replace函数转义了Summary和Description中的双引号,避免JSON语法错误;
    • 规范了字符串拼接的引号嵌套,确保生成的JSON符合Jira API要求。
  4. 增加状态码检查:通过.Status属性判断请求是否成功,同时捕获错误信息,方便调试。
  5. 统一变量名:将Pw改为PW,保持变量声明和赋值的一致性。

额外建议

  • 确保你的Jira账号有修改问题的权限;
  • 可以先将生成的IssueData复制到JSON校验工具中,确认格式是否正确;
  • 如果仍然有问题,可以查看Jira的API日志,或者输出.Status和.ResponseText的详细信息来定位问题。

内容的提问来源于stack exchange,提问作者Aly

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 08:42:36