Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json 手动使用Jira Rest API与以编程方式使用Jira Rest API有区别吗?_Json_Vba_Excel_Jira Rest Api - Fatal编程技术网

Json 手动使用Jira Rest API与以编程方式使用Jira Rest API有区别吗?

Json 手动使用Jira Rest API与以编程方式使用Jira Rest API有区别吗?,json,vba,excel,jira-rest-api,Json,Vba,Excel,Jira Rest Api,Jira Rest API新手…我想用VBA程序登录我的本地Jira服务器。我可以登录并手动使用restapi和URL&获取我正在寻找的JSON响应,但是每次我尝试使用VBA(Excel)这样做时,都会出现以下错误 {“errorMessages”:[“您没有查看指定邮件的权限。” 问题“”,“需要登录”],“错误”:{} 我使用的是基本授权。我还有别的事要做吗?(我正在使用下面的代码,我可以从其他帖子中复制)。也许Jira认为我的代码与我的登录名不同 Sub JiraRestGetCall()

Jira Rest API新手…我想用VBA程序登录我的本地Jira服务器。我可以登录并手动使用restapi和URL&获取我正在寻找的JSON响应,但是每次我尝试使用VBA(Excel)这样做时,都会出现以下错误

{“errorMessages”:[“您没有查看指定邮件的权限。” 问题“”,“需要登录”],“错误”:{}

我使用的是基本授权。我还有别的事要做吗?(我正在使用下面的代码,我可以从其他帖子中复制)。也许Jira认为我的代码与我的登录名不同

Sub JiraRestGetCall()
   Call JiraRest
End Sub


Private Function UserPassBase64() As String
    Dim objXML As MSXML2.DOMDocument60
    Dim objNode As MSXML2.IXMLDOMElement
    Dim arrData() As Byte

    arrData = StrConv("MyUserName:MyPassword", vbFromUnicode)

    Set objXML = New MSXML2.DOMDocument60
    Set objNode = objXML.createElement("b64")
    objNode.DataType = "bin.base64"
    objNode.nodeTypedValue = arrData

    UserPassBase64 = objNode.Text

End Function

Public Function JiraRest()
    Dim JiraService As New MSXML2.XMLHTTP60

    With JiraService
        .Open "Get", "http://localhost:8080/rest/api/2/issue/NP-1.json", False
        .SetRequestHeader "Content-Type", "application/json"
        .SetRequestHeader "Authorization", "Basic " & UserPassBase64
        .Send ""
        If .Status = "401" Then
            MsgBox "Not authorized of invalid username/password"
        Else
            Set MyRequest = CreateObject("WinHttp.WinHttpRequest.5.1")
            MyRequest.Open "Get", "http://localhost:8080/rest/api/2/issue/NP-1.json"
            MyRequest.Send
            MsgBox MyRequest.ResponseText
        End If
    End With
End Function

我个人经常和吉拉联系。你的代码在其他地方看起来很好。如果您的基本加密工作正常,我看不出错误可能来自何处。

以下是我用于向Jira请求数据的函数。它当然可以被清理/通用化(更不用说添加错误处理),但就我的目的而言,它工作得很好

这段代码的大部分归功于Patrick的回答:

其工作原理如下:

  • 发布新的Jira会话,包括您的登录信息,并从响应中提取会话ID
  • 获取所需的任何数据,包括标头中的会话ID
  • 删除会话
  • 如果一次执行大量的
    get
    ,可以将其拆分为3个单独的函数,并且只运行步骤1和步骤3一次

    Function getJiraJSON(restURL As String, requestString As String, jiraUsername As String, jiraPassword As String) As String
        Dim JiraService As New MSXML2.XMLHTTP60
        Dim JiraAuth As New MSXML2.XMLHTTP60
        Dim postResp As String
        Dim cookieVal As String
    
        With JiraAuth
            .Open "POST", restURL & "auth/1/session", False
            .setRequestHeader "Content-Type", "application/json"
            .setRequestHeader "Accept", "application/json"
            .setRequestHeader "X-Atlassian-Token", "no-check"
    
            .send " {""username"" : """ & jiraUsername & """, ""password"" : """ & jiraPassword & """}"""
            postResp = .responseText
            cookieVal = "JSESSIONID=" & Mid(postResp, 42, 32) & "; Path=/Jira"  'Extract the Session-ID
        End With
    
        With JiraService
            .Open "GET", restURL & requestString, False
    
            .setRequestHeader "Content-Type", "application/json"
            .setRequestHeader "Accept", "application/json"
            .setRequestHeader "Set-Cookie", cookieVal
    
            .send
            getJiraJSON = .responseText
        End With
    
        With JiraAuth
            .Open "DELETE", restURL & "auth/1/session", False
            .send
        End With
    End Function
    
    在您的情况下,您可以将其称为:

    MsgBox getJiraJSON("http://localhost:8080/rest/", "api/2/issue/NP-1.json", "myUsername", "myPassword")