Nic*_*Nex 6 httprequest go telegram-bot
我是 golang 的新手,我正在尝试编写一个函数,该函数将一个带有 post 请求的文件上传到我正在编写的机器人的电报。
我已经尝试过使用此代码,但我从电报中得到的错误是
Bad Request: there is no photo in the request
.
我在网上搜索过如何做到这一点,但我发现的一切都没有帮助我解决这个问题。
func SendPostRequest (url string, filename string) []byte {
file, err := os.Open(filename)
if err != nil {
log.Fatal(err)
}
defer file.Close()
response, err := http.Post(url, "binary/octet-stream", file)
if err != nil {
log.Fatal(err)
}
defer response.Body.Close()
content, err := ioutil.ReadAll(response.Body)
if err != nil {
log.Fatal(err)
}
return content
}
Run Code Online (Sandbox Code Playgroud)
我正在调用 SendPostRequest 的函数是
func (e Engine) SendPhoto (filename string, chatId int64) APIResponse {
var url = fmt.Sprintf("%ssendPhoto?chat_id=%d", e.baseUrl, chatId)
var content []byte = SendPostRequest(url, filename)
var response APIResponse
json.Unmarshal(content, &response)
return response
}
Run Code Online (Sandbox Code Playgroud)
编辑:我在代码中使用的 Telegram bot api 的链接是https://core.telegram.org/bots/api
Nic*_*Nex 12
经过一番挖掘,我想通了这个
func SendPostRequest (url string, filename string, filetype string) []byte {
file, err := os.Open(filename)
if err != nil {
log.Fatal(err)
}
defer file.Close()
body := &bytes.Buffer{}
writer := multipart.NewWriter(body)
part, err := writer.CreateFormFile(filetype, filepath.Base(file.Name()))
if err != nil {
log.Fatal(err)
}
io.Copy(part, file)
writer.Close()
request, err := http.NewRequest("POST", url, body)
if err != nil {
log.Fatal(err)
}
request.Header.Add("Content-Type", writer.FormDataContentType())
client := &http.Client{}
response, err := client.Do(request)
if err != nil {
log.Fatal(err)
}
defer response.Body.Close()
content, err := ioutil.ReadAll(response.Body)
if err != nil {
log.Fatal(err)
}
return content
}
Run Code Online (Sandbox Code Playgroud)