Как преобразовать команду @ data.file curl в VBA? - PullRequest
0 голосов
/ 25 июня 2019

У меня есть команда curl, которая загружает некоторые данные в API и возвращает результаты

curl -X POST -H 'Content-Type: text/csv' --data-binary @data/data.csv https://some.url.com/invocations > data/churn_scored.jsonl

Однако я не могу понять, как это сделать с помощью VBA после прочтения документации (https://docs.microsoft.com/en-au/windows/desktop/WinHttp/winhttprequest).

В частности, было бы здорово, если бы я мог обработать диапазон ячеек в Excel, как если бы это был CSV, и загрузить его.

Другой пост ( Эквивалентный cURL в VBA? ) показывает, как свернуть конечную точку, но не показывает, как загрузить данные с помощью команды @, которая является центральной точкой этого вопроса.

1 Ответ

1 голос
/ 25 июня 2019

Попробуйте это

Public saveName as string

Function SaveSheetAsWorkbook()
    Dim NewWb As Workbook
    Dim ws As Worksheet
        saveName = "c:\1.csv"
        Set ws = wbT.Worksheets("Sheet1")
        Set NewWb = Workbooks.Add
        With NewWb
            ws.Copy Before:=.Worksheets(1)
            If .Worksheets.Count > 1 Then .Worksheets(2).Delete
            .SaveAs saveName, xlCSV
            .Close
        End With
End Function

Function AuthSite()
    Dim WinHttpReq, oStream
    Set WinHttpReq = CreateObject("WINHTTP.WinHTTPRequest.5.1")
    WinHttpReq.Open "POST", "https://some.url.com/invocations", False
        WinHttpReq.setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 6.1; rv:32.0) Gecko/20100101 Firefox/32.0"
        WinHttpReq.setRequestHeader "Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
        WinHttpReq.setRequestHeader "Accept-Language", "en-US;q=0.5"
        'WinHttpReq.setRequestHeader "Accept-Encoding", "gzip, deflate, br"
        WinHttpReq.setRequestHeader "Referer", strUrls
        'WinHttpReq.setRequestHeader "Cookie", cookie
        WinHttpReq.setRequestHeader "Connection", "keep-alive"
        WinHttpReq.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
    WinHttpReq.send saveName
    Set AuthSite = WinHttpReq
End Function

или используйте составную форму

Public Boundary as string

Function UploadFile(ByVal filePath As String, ByVal FileName As String)
  Dim sFormData As String
  Randomize
  Boundary = "---------------------------" & Int(999999999999999# * Rnd)
  sFormData = GetFile(filePath & "\" & FileName)
    D = "--" + Boundary + vbCrLf
        '------1----------
        strF = "_method"
        strFval = "POST"
            D = D + "Content-Disposition: form-data; name=""" + strF + """;" + vbCrLf + vbCrLf
            D = D + strFval
            D = D + vbCrLf + "--" + Boundary + vbCrLf

    'Build source form with file contents
    FieldName = "yourFieldName"
        D = D + "Content-Disposition: form-data; name=""" + FieldName + """;"
        D = D + " filename=""" + FileName + """" + vbCrLf
        D = D + "Content-Type: application" + vbCrLf + vbCrLf
        D = D + sFormData
        D = D + vbCrLf + "--" + Boundary + "--" + vbCrLf

  'Post the data To the destination URL

  UploadFile = D

End Function


'read binary file As a string value
Function GetFile(ByVal FileName As String) As String
    Dim FileContents() As Byte, FileNumber As Integer
    ReDim FileContents(FileLen(FileName) - 1)
    FileNumber = FreeFile
    Open FileName For Binary As FileNumber
        Get FileNumber, , FileContents
    Close FileNumber
    GetFile = StrConv(FileContents, vbUnicode)
End Function

Function AuthSite2()
    Dim WinHttpReq, oStream
    Set WinHttpReq = CreateObject("WINHTTP.WinHTTPRequest.5.1")
    strPost = UploadFile(fPath, fName)
    ReDim bFormData(Len(strPost) - 1)
    bFormData = StrConv(strPost, vbFromUnicode)

    WinHttpReq.Open "POST", "https://some.url.com/invocations", False
        WinHttpReq.setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 6.1; rv:32.0) Gecko/20100101 Firefox/32.0"
        WinHttpReq.setRequestHeader "Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
        WinHttpReq.setRequestHeader "Accept-Language", "en-US;q=0.5"
        'WinHttpReq.setRequestHeader "Accept-Encoding", "gzip, deflate, br"
        WinHttpReq.setRequestHeader "Referer", "https://some.url.com/invocations"
        WinHttpReq.setRequestHeader "Connection", "keep-alive"
        WinHttpReq.setRequestHeader "Content-Type", "multipart/form-data; boundary=" + Boundary + vbCrLf
    WinHttpReq.send bFormData
    Set AuthSite2 = WinHttpReq
End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...