[rt-users] Need help getting REST API calls to work using WinHttpRequest from VBA

tim telkin at afslc.com
Mon Apr 18 07:58:44 EDT 2016


By using the following code placed into a class called clsRT_Ticket I was
able to create RT Tickets within VBA successfully.  Hope this helps others
that have run into this issue with VBA.

'Must Include Microsoft WinHTTP Services, version 5 (winhttp.dll) in your
reference

'NOTE: to call CreateTicket function from code
'Set RT_Ticket = New clsRT_Ticket
'With RT_Ticket
'    .ProcessBar = Me.StatusBar
'    .DisplayTicketInfoUponCreation = True
'    .Body = sbody
'    .PIDs = cPIDs
'    .BankID_Old = sOrgReturnedCheck_BankID
'    .BankID_New = ReturnedCheck.BankId
'    .CreateTicket
'End With
'Set RT_Ticket = Nothing

Private WinHttpReq As WinHttpRequest

Private Const multiPartBoundary As String = "--xYzZY"

Private mvarRT_URL As String
Private mvarRT_CreateTICKET As String
Private mvarRT_ShowTICKET As String
Private mvarRT_Auth_User As String
Private mvarRT_Auth_PWD As String

Private mvarSessionCookie As String
Private mvarCookieHolder As Variant

Private mvarBody As String
Private mvarRequestor As String
Private mvarSubject As String
Private mvarTicketNumber As String
'

Private Sub Class_Initialize()
    'create the WinHttpRequest object
    Set WinHttpReq = New WinHttpRequest

    mvarRT_URL = "https://(RT server):#####"  'where ##### points to a valid
port if needed
    mvarRT_CreateTICKET = mvarRT_URL & "/REST/1.0/ticket/new"
    mvarRT_ShowTICKET = mvarRT_URL & "/REST/1.0/ticket/%ticket%/SHOW"
    mvarRT_Auth_User = "(valid RT user name)"
    mvarRT_Auth_PWD = "(valid RT user password)"
    mvarRequestor = "(valid RT requestor name)"
        
    mvarBody = ""
    mvarSubject = ""
    mvarTicketNumber = ""
    
End Sub

Private Sub Class_Terminate()
    Set WinHttpReq = Nothing

End Sub

Public Function CreateTicket() As Boolean
    Dim sMultiPartData As String
    Dim sCustomFieldValue As String     'value to be placed into custom
field if used
    
    mvarBody = "text to be displayed in body of "
    mvarSubject = ""
    
    'setup multipart/form-data to be passed to RT request
    sMultiPartData = ""
    sMultiPartData = multiPartBoundary & vbCrLf
    sMultiPartData = sMultiPartData + "Content-Disposition: form-data;
name=""content""" + vbCrLf + vbCrLf
    sMultiPartData = sMultiPartData + "id: ticket/new" + vbCrLf
    sMultiPartData = sMultiPartData + "Subject: " + mvarSubject + vbCrLf
    sMultiPartData = sMultiPartData + "Text: " + mvarBody + vbCrLf
    sMultiPartData = sMultiPartData + "Requestor: " & mvarRequestor & vbCrLf
    
    'had to include next statement twice to get custom field values to be
accepted in RT
    sMultiPartData = sMultiPartData + "CF-(name of custom field): " +
sCustomFieldValue + vbCrLf
    sMultiPartData = sMultiPartData + "CF-(name of custom field): " +
sCustomFieldValue + vbCrLf
    
    sMultiPartData = sMultiPartData + "Queue: General" + vbCrLf
    sMultiPartData = sMultiPartData + "--xYzZY--"

    With WinHttpReq
        If getValidSessionCookie Then   'get cookie from first call to RT
            'Debug.Print .ResponseText
            
            '2) create New RT ticket
            .Open "POST", mvarRT_CreateTICKET
            .setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 6.1;
WOW64; rv:38.0) Gecko/20100101 Firefox/38.0"
            .setRequestHeader "Accept",
"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
            .setRequestHeader "Accept-Language", "en-US,en;q=0.5"
            .setRequestHeader "DNT", "1"
            .setRequestHeader "Referer", mvarRT_CreateTICKET
            .setRequestHeader "Cookie", mvarSessionCookie
            .setRequestHeader "Connection", "keep-alive"
            .setRequestHeader "Content-Type", "multipart/form-data;
boundary=xYzZY"
            .setRequestHeader "Content-Length", CStr(Len(sMultiPartData))
            .send (sMultiPartData)

            If .Status = 200 Then
                mvarTicketNumber = Trim(.responseText)
                If InStr(mvarTicketNumber, "401 Credentials required") < 1
Then
                    'get RT ticket number
                    mvarTicketNumber = Replace(mvarTicketNumber, Chr(10),
"")
                    If mvarTicketNumber <> "" Then
                        'return just the RT ticket number
                        mvarTicketNumber = Mid(mvarTicketNumber,
InStr(mvarTicketNumber, "# Ticket ") + Len("# Ticket "))
                        mvarTicketNumber = Replace(mvarTicketNumber, "
created.", "")
                    End If
                
                    Debug.Print "RT Ticket #" & CStr(mvarTicketNumber) & "
created."
                Else
                    Debug.Print .responseText
                    Debug.Print .getAllResponseHeaders
                End If
            Else
                Debug.Print .responseText
                Debug.Print .getAllResponseHeaders
            End If
        Else
            'cannot establish a connection to RT server, so try again up to
3 attempts only
            Debug.Print .responseText
            Debu8g.Print .getAllResponseHeaders
        End If
        
    End With
    
End Function

Public Function ShowTicket(ByVal sTicketNumber As String) As Boolean
    
    If getValidSessionCookie Then   'get initial request and cookie to pass
to RT request
        '3) show RT ticket information returned
        With WinHttpReq
            .Open "GET", Replace(mvarRT_ShowTICKET, "%ticket%",
sTicketNumber)
            .setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 6.1;
WOW64; rv:38.0) Gecko/20100101 Firefox/38.0"
            .setRequestHeader "Accept",
"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
            .setRequestHeader "Accept-Language", "en-US,en;q=0.5"
            .setRequestHeader "DNT", "1"
            .setRequestHeader "Cookie", mvarSessionCookie
            .setRequestHeader "Connection", "keep-alive"
            .send
    
            If .Status = 200 Then
                Debug.Print .responseText
            End If
        End With
    End If
    
End Function

Private Function getValidSessionCookie() As Boolean
    Dim sMsg As String
    
    With WinHttpReq
            
        .Option(4) = 13056  'WinHttpRequestOption_SslErrorIgnoreFlags 13056:
ignore all err,
        
        '1) get cookie to reuse (DO NOT CHANGE!!!)
        .Open "POST", mvarRT_URL
        .setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64;
rv:38.0) Gecko/20100101 Firefox/38.0"
        .setRequestHeader "Accept",
"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
        .setRequestHeader "Accept-Language", "en-US,en;q=0.5"
        .setRequestHeader "DNT", "1"
        .setRequestHeader "Connection", "keep-alive"
        .setRequestHeader "Content-Type",
"application/x-www-form-urlencoded"
        .setRequestHeader "Content-Length", Len("user=" & mvarRT_Auth_User &
"&pass=" & mvarRT_Auth_PWD)
        .send ("user=" & mvarRT_Auth_User & "&pass=" & mvarRT_Auth_PWD)
        
        If .Status = 200 Then
            mvarSessionCookie = .getResponseHeader("Set-Cookie")

            mvarCookieHolder = Split(mvarSessionCookie, ";")
            If UBound(mvarCookieHolder) > 0 Then
                'implicit conversion to string
                mvarSessionCookie = mvarCookieHolder(0)
            End If
        End If
        
    End With
    
End Function




--
View this message in context: http://requesttracker.8502.n7.nabble.com/Need-help-getting-REST-API-calls-to-work-using-WinHttpRequest-from-VBA-tp59981p61745.html
Sent from the Request Tracker - User mailing list archive at Nabble.com.



More information about the rt-users mailing list