HTTP POST Request with Base64 Barcode Image in Golang

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

  1. Read an image file as bytes.
  2. Convert the bytes to a base64 string.
  3. Encode the base64 string as JSON string.
  4. Send HTTP POST request with JSON.
  5. Get HTTP response.
  6. 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>

Source Code

https://github.com/dynamsoft-dbr/golang

Like what you read? Give Xiao Ling a round of applause.

From a quick cheer to a standing ovation, clap to show how much you enjoyed this story.