почему не byte. NewBuffer принимает полный запрос тела? - PullRequest
0 голосов
/ 29 марта 2020

Я новичок в golang, и я пишу скрипт для отправки сообщения в slack с помощью входящего webhook.

slackBody, _ := json.Marshal(SlackRequestBody{Text: msg, EventName: "xxx", AccountId: "xxx",
        EventTime: "xxxxx", UserName: "xxxx", yyy: "xx", Status: "xx"})
    fmt.Println(string(slackBody))
    //test := ioutil.ReadAll(bytes.NewBuffer(slackBody))
    req, err := http.NewRequest(http.MethodPost, webhookUrl, bytes.NewBuffer(slackBody))
    if err != nil {
        return err
    }

    req.Header.Add("Content-Type", "application/json")

    client := &http.Client{Timeout: 10 * time.Second}
    resp, err := client.Do(req)

Этот запрос на публикацию содержит только несколько слов запроса "req". Можете ли вы помогите разобраться с проблемой.

1 Ответ

0 голосов
/ 29 марта 2020

Здесь нет ничего плохого в bytes.NewBuffer(). Со стороны slack он распознал сообщение, предоставленное только текстовым полем. Вам необходимо изменить дизайн вашей SlackRequestBody структуры. Поскольку вы используете API Webhook для отправки сообщений, ваше тело запроса должно соответствовать формату структуры, заданному slack.

POST https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX
Content-type: application/json
{
  "text": ...
  "blocks": ...
  "attachments": ...
  "thread_ts": ...
  "mrkdwn": ... 
  ... ... ...
}

Итак, ваша структура SlackRequestBody должна выглядеть примерно так:

package main

import (
    "encoding/json"
    "fmt"
    "time"
)

type SlackRequestBody struct {
    Text            string  `json:"text"`
    Blocks          []Block `json:"blocks,omitempty"`
    ThreadTimestamp string  `json:"thread_ts,omitempty"`
    Mrkdwn          bool    `json:"mrkdwn,omitempty"`
}

type Block struct {
    BlockID string `json:"block_id,omitempty"`
    Type    string `json:"type"`
    Text    Text   `json:"text"`
}

type Text struct {
    Type string `json:"type"`
    Text string `json:"text"`
}

func main() {
    var payload = &SlackRequestBody{
        Text: "Your message",
        Blocks: []Block{
            {
                Type: "section",
                Text: Text{
                    Type: "plain_text",
                    Text: "User Name: XXXX",
                },
                BlockID: "username",
            },
            {
                Type: "section",
                Text: Text{
                    Type: "plain_text",
                    Text: "Event Time: " + time.Now().String(),
                },
                BlockID: "eventTime",
            },
        },
    }

    data, err := json.Marshal(payload)
    if err != nil {
        panic(err)
    }

    fmt.Println(string(data))

}

Выход:

{
   "text":"Your message",
   "blocks":[
      {
         "block_id":"username",
         "type":"section",
         "text":{
            "type":"plain_text",
            "text":"User Name: XXXX"
         }
      },
      {
         "block_id":"eventTime",
         "type":"section",
         "text":{
            "type":"plain_text",
            "text":"Event Time: 2020-03-29 14:11:33.533827881 +0600 +06 m=+0.000078203"
         }
      }
   ]
}

Я рекомендую использовать официальный go клиент слабины. Это обеспечит большую гибкость. Удачного кодирования.

...