VBA 실전. - 간단한 httplib.

9136 단어

개요


VBA의 응용 장면은 기본적으로 모두 단기 응용에 있다. 웹 응용이 유행하고 브라우저가 점점 강해지면서 단기 응용은 점점 몰락한다.
웹 응용이 갈수록 많아지고 기능과 체험도 점점 좋아지지만 Excel은 여전히 강한 생명력을 가지고 있다. 왜냐하면 웹 페이지의 표가 아무리 강력해도 Excel만큼 사용하기 편리하지 않기 때문이다.
Excel은 이렇게 많은 해 동안의 축적을 거쳐 매우 큰 사용자 기반을 가지고 있을 뿐만 아니라 표류 데이터에 대한 처리도 거의 극에 달했다.Excel 자체를 UI로 사용할 수 있다면, VBA를 통해 Excel과 백엔드 서비스를 연결하여 웹 페이지의 보조가 되고, 웹 페이지에서 Excel 표의 각종 기능을 강제로 실현하는 것이 아니라면, 반배의 효과가 있을 것이다.
VBA를 통해 백엔드의 API에 액세스하고 백엔드에서 반환되는 데이터(일반적으로 JSON 형식)를 분석하면 Excel을 웹 페이지의 보조적이고 효율적인 테이블 클래스 데이터 처리가 가능합니다.

VBA httplib 라이브러리의 간단한 구현


백엔드 API와 상호작용을 하기 위해서는 간단한 httplib 라이브러리를 실현하여 각 VBA 프로젝트에서 복용하기 편리하도록 해야 한다.
현재 자신의 수요에 따라 이 간단한 httplib 라이브러리는 다음과 같은 몇 가지 기능을 잠시 완성한다.
  • GET 요청을 보낼 수 있습니다
  • POST 요청을 보낼 수 있습니다
  • 요청한 JSON 데이터를 해석할 수 있습니다
  • POST 요청에 JSON 형식의 매개변수를 사용할 수 있습니다
  • 요청한 헤더에 jwt token 정보를 추가할 수 있습니다

  • 환경 준비


    httplib를 테스트하기 위해 golang의 gin 프레임워크로 http API 서비스를 간단하게 실현했다.코드 참고문 후의 부록1
    httplib는 주로 get/post 접근 API를 실현했고 매개 변수와 반환 값은 모두 json 형식 문자열이다.코드 참고문 후의 부록 2
    다음 테스트에서는 httplib를 사용하는 방법에 대해 설명합니다.

    GET 요청 보내기

     1  Function testGet()
     2      Dim hlib As New HttpLib
     3      Dim ret As Boolean
     4  
     5      hlib.SetUrl = "http://localhost:8000/get-test"
     6      ret = hlib.HttpGetJSON("")
     7      Debug.Print ret
     8      If ret = True Then
     9          Debug.Print hlib.GetJSONResp
    10      End If
    11  End Function

    SetUrl 이후 HttpGetJSON을 호출하면 다음과 같은 결과가 실행됩니다.
    True
    {"message":"get success"}

    POST 요청 보내기

     1  Function testPost()
     2      Dim hlib As New HttpLib
     3      Dim ret As Boolean
     4  
     5      hlib.SetUrl = "http://localhost:8000/post-test"
     6      ret = hlib.HttpPostJSON("")
     7      Debug.Print ret
     8      If ret = True Then
     9          Debug.Print hlib.GetJSONResp
    10      End If
    11  End Function

    SetUrl 이후 HttpPostJSON을 호출하면 다음과 같은 결과가 실행됩니다.
    True
    {"message":"post success"}

    확인 요청이 반환된 JSON 데이터


    반환된 JSON 데이터를 분석하려면 다른 VBA 모듈을 사용하십시오. VBA-JSON
     1  Function testPostWithReturn()
     2  
     3      Dim hlib As New HttpLib
     4      Dim ret As Boolean
     5  
     6      hlib.SetUrl = "http://localhost:8000/post-test-return"
     7      ret = hlib.HttpPostJSON("")
     8      Debug.Print ret
     9      If ret = True Then
    10          Dim resp As Object
    11          Set resp = JsonConverter.ParseJson(hlib.GetJSONResp)
    12          Debug.Print "response json: " & hlib.GetJSONResp
    13          Debug.Print "username: " & resp("username")
    14          Debug.Print "data -> list 1: " & resp("data")("list")(1)
    15          Debug.Print "data -> list 2: " & resp("data")("list")(2)
    16          Debug.Print "data -> list 3: " & resp("data")("list")(3)
    17      End If
    18  End Function

    참고 VBA-JSON 라이브러리를 사용할 때 Microsoft Scripting Runtime 참조를 추가해야 합니다.
    추가 방법, VBA 편집기에서 도구 -> 참조 -> Microsoft Scripting Runtime 추가
    실행 결과는 다음과 같습니다.
    True
    response json: {"data":{"list":["a","b","c"]},"username":"string"}
    username: string
    data -> list 1: a
    data -> list 2: b
    data -> list 3: c

    POST 요청에 JSON 형식의 매개변수

     1  Function testPostWithParam()
     2  
     3      Dim hlib As New HttpLib
     4      Dim ret As Boolean
     5      Dim p As Dictionary
     6      Set p = New Dictionary
     7  
     8      hlib.SetUrl = "http://localhost:8000/post-test-param"
     9      p("name") = "name"
    10      p("data") = Array("a", "b", "c")
    11  
    12      ret = hlib.HttpPostJSON(JsonConverter.ConvertToJson(p))
    13      Debug.Print ret
    14      If ret = True Then
    15          Debug.Print "response json: " & hlib.GetJSONResp
    16      End If
    17  End Function

    서버 로그에서 볼 수 있습니다. 실행 후 전달된 매개 변수를 얻었습니다.
    2019/10/09 12:14:38 param: struct { Name string "json:\"name\""; Data []string "json:\"data\"" }{Name:"name", Data:[]string{"a", "b", "c"}}

    요청한 헤더에 jwt token 정보 추가


    요청 중 헤더의 가입 정보는 매우 간단합니다. httplib 라이브러리의 HttpGetJSON과 HttpPostJSON 방법에는 다음과 같습니다.
    1  http.setRequestHeader "Content-Type", "text/json"
    2  http.setRequestHeader "If-Modified-Since", "0"  '  
    3  If jwtToken <> "" Then
    4      http.setRequestHeader "Authorization", "Bearer " & jwtToken
    5  End If

    부록


    부록1 테스트용 서버 (by golang)

     1  package main
     2  
     3  import (
     4   "log"
     5   "net/http"
     6  
     7   "github.com/gin-contrib/cors"
     8   "github.com/gin-gonic/gin"
     9  )
    10  
    11  func StartGinServ() {
    12   r := gin.Default()
    13   r.Use(cors.Default())
    14  
    15   r.GET("/get-test", func(c *gin.Context) {
    16     c.JSON(http.StatusOK, gin.H{
    17       "message": "get success",
    18     })
    19   })
    20  
    21   r.POST("/post-test", func(c *gin.Context) {
    22     c.JSON(http.StatusOK, gin.H{
    23       "message": "post success",
    24     })
    25   })
    26  
    27   var list = []string{"a", "b", "c"}
    28   r.POST("/post-test-return", func(c *gin.Context) {
    29     c.JSON(http.StatusOK, gin.H{
    30       "username": "string",
    31       "data": gin.H{
    32         "list": list,
    33       },
    34     })
    35   })
    36  
    37   r.POST("/post-test-param", func(c *gin.Context) {
    38     var param struct {
    39       Name string   `json:"name"`
    40       Data []string `json:"data"`
    41     }
    42  
    43     if err := c.BindJSON(&param); err != nil {
    44       log.Fatal("param error")
    45     }
    46  
    47     log.Printf("param: %#v
    ", param) 48 49 c.JSON(http.StatusOK, gin.H{ 50 "message": "post with param", 51 }) 52 }) 53 54 if err := r.Run(":8000"); err != nil { 55 log.Fatal(err) 56 } 57 58 }

    부록 2 완전한 httplib 라이브러리

     1  Option Explicit
     2  
     3  Const ClsName = "lib for http request"
     4  
     5  '  URL
     6  Dim url As String
     7  ' API  jwt token
     8  Dim jwtToken As String
     9  ' API json 
    10  Dim jsonResp As String
    11  
    12  '   URL  
    13  Public Property Let SetUrl(p As String)
    14      url = p
    15  End Property
    16  
    17  '   URL  
    18  Public Property Get GetUrl() As String
    19      GetUrl = url
    20  End Property
    21  
    22  '   jwt token  
    23  Public Property Let SetJwtToken(p As String)
    24      jwtToken = p
    25  End Property
    26  
    27  '   jwt token  
    28  Public Property Get GetJwtToken() As String
    29      GetJwtToken = jwtToken
    30  End Property
    31  
    32  '   json response  
    33  Public Property Get GetJSONResp() As String
    34      GetJSONResp = jsonResp
    35  End Property
    36  
    37  ' TODO  ,  ,   jwt token
    38  Function Login(user As String, pwd As String) As Boolean
    39      ' TODO  
    40      '       ,   jwtToken  
    41      Login = False
    42  End Function
    43  
    44  ' GET   API
    45  Function HttpGetJSON(jsonStr As String) As Boolean
    46      HttpGetJSON = False
    47      jsonResp = ""
    48  
    49      Dim http
    50      Set http = CreateObject("Msxml2.XMLHTTP")
    51      http.Open "GET", url, False
    52  
    53      '  headers
    54      http.setRequestHeader "Content-Type", "text/json"
    55      http.setRequestHeader "If-Modified-Since", "0"  '  
    56      If jwtToken <> "" Then
    57          http.setRequestHeader "Authorization", "Bearer " & jwtToken
    58      End If
    59  
    60      http.send jsonStr
    61  
    62      If http.Status = 200 Then
    63          jsonResp = http.responseText
    64          HttpGetJSON = True
    65      End If
    66  
    67  End Function
    68  
    69  ' POST   API
    70  Function HttpPostJSON(jsonStr As String) As Boolean
    71      HttpPostJSON = False
    72      jsonResp = ""
    73  
    74      Dim http
    75      Set http = CreateObject("Msxml2.XMLHTTP")
    76      http.Open "POST", url, False
    77  
    78      http.setRequestHeader "Content-Type", "text/json"
    79      http.setRequestHeader "If-Modified-Since", "0"  '  
    80      If jwtToken <> "" Then
    81          http.setRequestHeader "Authorization", "Bearer " & jwtToken
    82      End If
    83  
    84      http.send jsonStr
    85  
    86      If http.Status = 200 Then
    87          jsonResp = http.responseText
    88          HttpPostJSON = True
    89      End If
    90  End Function

    좋은 웹페이지 즐겨찾기