发送带有数据的请求

I'm trying to access an API like this:

package main

import (
    "bytes"
    "fmt"
    "io/ioutil"
    "net/http"
    "net/url"
)

func main() {
    apiUrl := "https://example.com/api/"
    data := url.Values{}
    data.Set("api_token", "MY_KEY")
    data.Add("action", "list_projects")
    req, _ := http.NewRequest("POST", apiUrl, bytes.NewBufferString(data.Encode()))
    client := &http.Client{}
    resp, err := client.Do(req)
    defer resp.Body.Close()
    if err == nil {
        body, _ := ioutil.ReadAll(resp.Body)
        fmt.Println(resp.Status)
        fmt.Println(string(body))
    }
}

But the response from an API tells me there was no data in POST request.

If I do it like this with curl, it works:

$ curl -X POST "https://example.com/api/" -d "api_token=MY_KEY" -d "action=list_projects"

You may want to use this form of request

resp, err := http.PostForm("http://example.com/form", 
                            url.Values{"key": {"Value"}, "id": {"123"}})

or use the right mime type :

req.Header.Set("Content-Type", "application/x-www-form-urlencoded")

and encode data

strings.NewReader(data.Encode())

It's better if you test err != nil and return if necessary. This code may not work cause the request failed.

defer resp.Body.Close()

instead use this pattern:

client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
    fmt.Println(err)
    return
}
defer resp.Body.Close()
body, _ := ioutil.ReadAll(resp.Body)
fmt.Println(resp.Status)
fmt.Println(string(body))

So you can see in the console if the request failed or not