Dynamsoft has deployed a REST web service for barcode detection. This post shares how to call the service by sending HTTP POST request using Golang.
Barcode Detection in Golang
Environment
- IDE: JetBrain Gogland.
- Go 1.7.4.
- Windows 10.
- Workspace structure:
<GOPATH>
- src
- bin
- pkg
- Settings:
GOROOT=E:\Go
GOPATH=g:\gowork
Basic Steps to Call Barcode Web Service
- Read an image file as bytes.
- Convert the bytes to a base64 string.
- Encode the base64 string as JSON string.
- Send HTTP POST request with JSON.
- Get HTTP response.
- Decode response body as JSON and get the barcode detection result.
Read File and Encode as Base64
Read an image file as bytes with Package ioutil:
import "io/ioutil"
data, err := ioutil.ReadFile(filename)
Encode bytes as base64 with Package base64. When using goroutine for I/O, you can use a channel to send and receive values:
import "encoding/base64"
channel <- base64.StdEncoding.EncodeToString(data)
Encode and Decode JSON
Store data in a map:
base64data := <-channel
data := make(map[string]interface{})
data["image"] = base64data
data["barcodeFormat"] = 234882047
data["maxNumPerPage"] = 1
Generate the JSON encoding of the map with Package json:
jsonData, err := json.Marshal(data)
Decode JSON to get the barcode result with Token:
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 Request
Send HTTP request with Package http:
import "net/http"
url := "http://demo1.dynamsoft.com/dbr/webservice/BarcodeReaderService.svc/Read"
resp, err := http.Post(url, "application/json", bytes.NewBuffer(jsonData))
Demo
Get the package:
go get github.com/dynamsoft-dbr/golang/web-service
Import the package to a Go project:
import
"github.com/dynamsoft-dbr/golang/web-service"
Create main.go:
package main
import (
"os"
"fmt"
"github.com/dynamsoft-dbr/golang/web-service"
)
func main() {
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.")
}
Build and run the console app:
go install
<GOPATH>/bin/main <barcode image file>