1

I'm trying to do a http request which is developed in Golang. when I made a request to retrieve all student data, the data was successfully retrieved. but when I make a request to retrieve student data by ID, I can't retrieve it, I get the following Output:

// fetch all student data
ID: A001         Name:Ipal       Grade:42
ID: B002         Name:Ver        Grade:42
ID: C003         Name:Kris       Grade:42

// fetch student data by Id
 id=B002
payload:  id=B002
request data: &{GET http://localhost:8080/user 
HTTP/1.1 1 1 map[] {id=B002} 0x5f75e0 7 [] false localhost:8080 map[] 
map[] <nil> map[] <nil> <nil> <nil> 0xc00012c020}
DATA-DATA: {  0}
DATA-DATA: {  0}
Data: {  0}
{  0} invalid character 'U' looking for beginning of value
Error! invalid character 'U' looking for beginning of value
2

my student struct script is:

type student struct {
    ID    string
    Name  string
    Grade int
}

my script to fetch all student data is:

func fetchUsers() ([]student, error) {
    var err error
    var client = &http.Client{}
    var data []student

    request, err := http.NewRequest("GET", baseURL+"/users", nil)
    if err != nil {
        return nil, err
    }

    response, err := client.Do(request)
    if err != nil {
        return nil, err
    }

    defer response.Body.Close()

    err = json.NewDecoder(response.Body).Decode(&data)
    if err != nil {
        return nil, err
    }

    return data, nil
}

And here my code to fetch student data by ID:

func fetchUser(ID string) (student, error) {
    var err error
    var client = &http.Client{}
    var data student

    var param = url.Values{}
    param.Set("id", ID)
    var payload = bytes.NewBufferString(param.Encode())
    fmt.Println("", bytes.NewBufferString(param.Encode()))
    fmt.Println("payload: ", payload)

    request, err := http.NewRequest("", "http://localhost:8080/user", payload)
    fmt.Println("request data:", request)
    fmt.Println("DATA-DATA:", data)
    if err != nil {
        // fmt.Println("DATA-DATA:", data)
        return data, err
    }
    fmt.Println("DATA-DATA:", data)
    
    request.Header.Set("Content-Type", "application/x-www-form-urlencoded")
    response, err := client.Do(request)
    if err != nil {
        return data, err
    }

    defer response.Body.Close()

    err = json.NewDecoder(response.Body).Decode(&data)
    if err != nil {
        fmt.Println("Data:", data)
        return data, err
    }
    fmt.Println("Data1:", data)
    return data, nil
}

And here my func main script is:

func main() {
var users, err = fetchUsers()

    if err != nil {
        fmt.Println("Error!", err.Error())
        return
    }
    for _, each := range users {
        fmt.Printf("ID: %s\t Name:%s\t Grade:%d\n", each.ID, each.Name, each.Grade)

    var user1, err = fetchUser("B002")
    if err != nil {
        fmt.Println("Error!", err.Error())
        return
    }
    fmt.Printf("ID: %s\t Name: %s\t Grade: %d\n", user1.ID, user1.Name, user1.Grade)
}

Please Help me Friends

Ipal
  • 135
  • 1
  • 10
  • 4
    The response is more than likely invalid json – thecoolestguyever123 Mar 09 '22 at 04:38
  • response in func fetchUsers and func fetchUser(ID string) is same. does it not work on fetch student by Id? – Ipal Mar 09 '22 at 04:44
  • 2
    You don't check the status code of the response. It's likely that the service only sends you json in the format that you expect when the status code is 200, or in the range 200-299, and not if the service reported an error. Check the status code, and also print the body when you're debugging to see what it contained instead of valid json. – Erwin Bolwidt Mar 09 '22 at 07:43
  • @ErwinBolwidt Thank you Sir. I have fixed my error and make output status code if my program has error or Success – Ipal Mar 18 '22 at 02:25

0 Answers0