VBA 실전. - 간단한 httplib.
개요
VBA의 응용 장면은 기본적으로 모두 단기 응용에 있다. 웹 응용이 유행하고 브라우저가 점점 강해지면서 단기 응용은 점점 몰락한다.
웹 응용이 갈수록 많아지고 기능과 체험도 점점 좋아지지만 Excel은 여전히 강한 생명력을 가지고 있다. 왜냐하면 웹 페이지의 표가 아무리 강력해도 Excel만큼 사용하기 편리하지 않기 때문이다.
Excel은 이렇게 많은 해 동안의 축적을 거쳐 매우 큰 사용자 기반을 가지고 있을 뿐만 아니라 표류 데이터에 대한 처리도 거의 극에 달했다.Excel 자체를 UI로 사용할 수 있다면, VBA를 통해 Excel과 백엔드 서비스를 연결하여 웹 페이지의 보조가 되고, 웹 페이지에서 Excel 표의 각종 기능을 강제로 실현하는 것이 아니라면, 반배의 효과가 있을 것이다.
VBA를 통해 백엔드의 API에 액세스하고 백엔드에서 반환되는 데이터(일반적으로 JSON 형식)를 분석하면 Excel을 웹 페이지의 보조적이고 효율적인 테이블 클래스 데이터 처리가 가능합니다.
VBA httplib 라이브러리의 간단한 구현
백엔드 API와 상호작용을 하기 위해서는 간단한 httplib 라이브러리를 실현하여 각 VBA 프로젝트에서 복용하기 편리하도록 해야 한다.
현재 자신의 수요에 따라 이 간단한 httplib 라이브러리는 다음과 같은 몇 가지 기능을 잠시 완성한다.
환경 준비
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(¶m); 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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.