What the code below does:
It gets to a given URL and responses with a plain text made of random numbers. At this moment the data is slice []byte, but I'd like to use those data so I think best solution would be to convert data to slice []int.
Here comes my code:
func getRandomInt(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
resp, err := http.Get("https://www.random.org/integers/?num=5&min=1&max=10&col=1&base=10&format=plain&rnd=new")
if err != nil {
fmt.Println("No response from request")
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body) // response body is []byte
if err != nil {
fmt.Println(err)
}
err = json.Unmarshal(body, &bodyInt)
if err != nil {
fmt.Println(err)
}
//MY CONVERTER
bodyInt := make([]int, len(body))
for i, b := range body {
bodyInt[i] = int(b)
}
js, err := json.Marshal(bodyInt)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
w.Write(js)
fmt.Println("Endpoint Hit: getRandomInt")
}
I've tried to do a little bit of conversion myself. With given URL I should get 5 numbers in the range of 1 to 10. What I get after conversion are 10-11 numbers in the range of 10 to 60.
I did some tests and when the structure of body is like below, cnversion works fine.
body = []byte{1, 2, 3, 4, 5}
So I think I read data from url response in a little different format, but have no idea how to solve that issue. Thanks.
CodePudding user response:
If you curl
that URL you can clearly see that the response is not JSON, so you shouldn't treat it as such.
curl 'https://www.random.org/integers/?num=5&min=1&max=10&col=1&base=10&format=plain&rnd=new'
5
10
4
4
2
It's just a new-line separated list of integers, so you should treat it as such.
resp, err := http.Get("https://www.random.org/integers/?num=5&min=1&max=10&col=1&base=10&format=plain&rnd=new")
if err != nil {
fmt.Println(err)
return
}
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
if err != nil {
fmt.Println(err)
return
}
lines := strings.Split(string(body), "\n")
numbers := []int{}
for i := range lines {
line := strings.TrimSpace(lines[i])
if line == "" {
continue
}
num, err := strconv.Atoi(line)
if err != nil {
fmt.Println(err)
return
}
numbers = append(numbers, num)
}
// do something with numbers