1. 程式人生 > >Go語言:REST Web服務呼叫

Go語言:REST Web服務呼叫

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>

golang barcode result

原始碼