Home > Back-end >  Extracting Data From Kafka REST Proxy in Go
Extracting Data From Kafka REST Proxy in Go

Time:09-29

I am using the REST proxy instance of Kafka for producing and consuming messages.Using the API to get new messages but I am not able to convert those messages to a struct model in Go. For example:

// Get records
req, err := http.NewRequest(http.MethodGet, fmt.Sprintf(FETCH_CONSUMER, URL, GROUP, CONSUMER), nil)
if err != nil {
    panic(err)
}
req.Header.Add("Accept", CONTENT_TYPE)
respRecords, err := client.Do(req)
if err != nil {
    panic(err)
}
defer respRecords.Body.Close()
fmt.Printf("Response %s\n", respRecords.Status)
fmt.Println(respRecords.Body)
recordsBodyResp := bufio.NewScanner(respRecords.Body)

for recordsBodyResp.Scan() {
    fmt.Printf("<--Body %s\n", recordsBodyResp.Text())
    
}

The value returned is in the following format:

[{"topic":"backward","key":null,"value":{"AdoptionID":"abcd123","IPAddress":"8.8.8.8","Port":"80","Status":"requested"},"partition":0,"offset":7}]

Since it's an array of objects, I want to extract the value portion of the key "value" into a struct. That is where I am stuck.

CodePudding user response:

You can create a struct like:

type AutoGenerated []struct {
    Topic     string      `json:"topic"`
    Key       interface{} `json:"key"`
    Value     Value       `json:"value"`
    Partition int         `json:"partition"`
    Offset    int         `json:"offset"`
}
type Value struct {
    AdoptionID string `json:"AdoptionID"`
    IPAddress  string `json:"IPAddress"`
    Port       string `json:"Port"`
    Status     string `json:"Status"`
}

And Unmarshal in that struct.

See this sample code:

package main

import (
    "fmt"
        "encoding/json"

)

func main() {



type Value struct {
    AdoptionID string `json:"AdoptionID"`
    IPAddress  string `json:"IPAddress"`
    Port       string `json:"Port"`
    Status     string `json:"Status"`
}

type AutoGenerated []struct {
    Topic     string      `json:"topic"`
    Key       interface{} `json:"key"`
    Value     Value       `json:"value"`
    Partition int         `json:"partition"`
    Offset    int         `json:"offset"`
}


    byt := []byte(`[{"topic":"backward","key":null,"value":{"AdoptionID":"abcd123","IPAddress":"8.8.8.8","Port":"80","Status":"requested"},"partition":0,"offset":7}]`)
   var dat AutoGenerated

   if err := json.Unmarshal(byt, &dat); err != nil {
        panic(err)
    }
    fmt.Printf("%#v", dat)

}

  • Related