Go語言:REST Web服務呼叫
阿新 • • 發佈:2018-12-22
Dynamsoft部署了基於REST的條形碼服務。這裡分享下如何使用Go語言傳送包含BASE64影象資料的HTTP POST請求。
環境配置
- IDE: JetBrain Gogland.
- Go 1.7.4.
- Windows 10.
- 工作目錄結構:
<GOPATH> - src - bin - pkg
- Go設定:
GOROOT=E:\Go GOPATH=g:\gowork
基本步驟
1. 讀取影象檔案。
2. 把byte陣列轉換成base64字串。
3. JSON編碼。
4. 通過HTTP POST傳送JSON資料。
5. 伺服器識別條形碼返回結果。
6. JSON解碼獲取結果。
檔案讀取與BASE64轉換
import "io/ioutil"
data, err := ioutil.ReadFile(filename)
Base64編碼。因為I/O比較耗時,可以放到goroutine中去執行。通過channel返回結果:
import "encoding/base64"
channel <- base64.StdEncoding.EncodeToString(data)
JSON編解碼
先把資料儲存在map中:
base64data := <-channel
data := make(map[string]interface{})
data["image" ] = base64data
data["barcodeFormat"] = 234882047
data["maxNumPerPage"] = 1
jsonData, err := json.Marshal(data)
返回結果JSON解碼:
result, _ := ioutil.ReadAll(resp.Body)
// decode JSON
const resultKey = "displayValue"
dec := json.NewDecoder(bytes.NewReader(result))
for {
t, err := dec.Token()
if err == io.EOF {
break
}
if err != nil {
log.Fatal(err)
}
tmp := fmt.Sprintf("%v", t)
if tmp == resultKey {
t, _ := dec.Token()
tmp := fmt.Sprintf("%v", t)
fmt.Println("Barcode result: ", tmp)
break
}
}
HTTP POST請求
import "net/http"
url := "http://demo1.dynamsoft.com/dbr/webservice/BarcodeReaderService.svc/Read"
resp, err := http.Post(url, "application/json", bytes.NewBuffer(jsonData))
測試
1. 獲取依賴包:
go get github.com/dynamsoft-dbr/golang/web-service
2. 在Go工程中匯入依賴:
import "github.com/dynamsoft-dbr/golang/web-service"
3. 建立main.go:
package main
import (
"os"
"fmt"
"github.com/dynamsoft-dbr/golang/web-service"
)
funcmain() {
var filename string
if len(os.Args) == 1 {
fmt.Println("Please specify a file.")
return
}
filename = os.Args[1]
_, err := os.Stat(filename)
if err != nil {
fmt.Println(err)
fmt.Println("Please specify a vailid file name.")
return
}
channel := make(chan string)
// read file to base64
go web_service.File2Base64(filename, channel)
// read barcode with Dynamsoft web service
web_service.ReadBarcode(channel)
fmt.Println("Done.")
}
4. 編譯執行程式:
go install
<GOPATH>/bin/main <barcode image file>