|
1 | 1 | # Пример использования |
2 | 2 |
|
3 | | -Иниализация клиента + опция включения заголовка "Accept-Encoding":"gzip", ответ будет возвращаться сжатым: |
| 3 | +Иниализация клиента + опция включения заголовка "Accept-Encoding":"gzip", ответ будет возвращаться сжатым, реализована декомпрессия тела ответа внутри вызова. |
4 | 4 |
|
| 5 | +```golang |
5 | 6 | import ( |
6 | 7 | "github.com/stvoidit/megaplan/v3" |
7 | 8 | ) |
|
12 | 13 | func main() { |
13 | 14 | client := megaplan.NewClient(domain, token, megaplan.OptionEnableAcceptEncodingGzip(true)) |
14 | 15 | } |
15 | | - |
| 16 | +``` |
16 | 17 | ## Пример создания задачами |
17 | 18 | https://demo.megaplan.ru/api/v3/docs#entityTask |
18 | | -Для удобства составления json для тела запроса есть функция __megaplan.BuildQueryParams__. Её единственное название - собрать параметры в правильном формате. |
| 19 | +Для удобства составления json для тела запроса есть функция __megaplan.BuildQueryParams__. Её единственное назначение - собрать параметры в правильном формате. |
19 | 20 | Некоторые сущности требуют специального формата (например [Дата и Время](https://demo.megaplan.ru/api/v3/docs#entityDateTime), [Интервал](https://demo.megaplan.ru/api/v3/docs#entityDateInterval), [Дата](https://demo.megaplan.ru/api/v3/docs#entityDateOnly), [~~Сдвиг дат~~](https://demo.megaplan.ru/api/v3/docs#entityShiftDate)), то функция __megaplan.BuildQueryParams__ корректно сформирует структуру этих сущностей. |
20 | 21 |
|
21 | | - func CreateTask(c *megaplan.ClientV3) { |
22 | | - const endpoint = "/api/v3/task" |
23 | | - var qp = megaplan.BuildQueryParams( |
24 | | - megaplan.SetRawField("contentType", "Task"), |
25 | | - megaplan.SetRawField("isUrgent", false), |
26 | | - megaplan.SetRawField("isTemplate", false), |
27 | | - megaplan.SetRawField("name", "library test"), |
28 | | - megaplan.SetRawField("subject", "subject library test"), |
29 | | - megaplan.SetRawField("statement", "statement library test"), |
30 | | - megaplan.SetEntityField("owner", "Employee", 1000129), |
31 | | - megaplan.SetEntityField("responsible", "Employee", 1000129), |
32 | | - megaplan.SetEntityField("deadline", "DateOnly", time.Now().Add(time.Hour*72)), |
33 | | - megaplan.SetEntityField("plannedWork", "DateInterval", time.Hour*13), |
34 | | - ) |
35 | | - r, err := qp.ToReader() |
36 | | - if err != nil { |
37 | | - panic(err) |
38 | | - } |
39 | | - rc, err := c.DoRequestAPI(http.MethodPost, endpoint, nil, r) |
40 | | - if err != nil { |
41 | | - panic(err) |
42 | | - } |
43 | | - defer rc.Close() |
44 | | - os.Stdout.ReadFrom(rc) |
45 | | - } |
46 | 22 |
|
| 23 | +```golang |
| 24 | +func CreateTask(c *megaplan.ClientV3) { |
| 25 | + const endpoint = "/api/v3/task" |
| 26 | + var qp = megaplan.BuildQueryParams( |
| 27 | + megaplan.SetRawField("contentType", "Task"), |
| 28 | + megaplan.SetRawField("isUrgent", false), |
| 29 | + megaplan.SetRawField("isTemplate", false), |
| 30 | + megaplan.SetRawField("name", "library test"), |
| 31 | + megaplan.SetRawField("subject", "subject library test"), |
| 32 | + megaplan.SetRawField("statement", "statement library test"), |
| 33 | + megaplan.SetEntityField("owner", "Employee", 1000129), |
| 34 | + megaplan.SetEntityField("responsible", "Employee", 1000129), |
| 35 | + megaplan.SetEntityField("deadline", "DateOnly", time.Now().Add(time.Hour*72)), |
| 36 | + megaplan.SetEntityField("plannedWork", "DateInterval", time.Hour*13), |
| 37 | + ) |
| 38 | + r, err := qp.ToReader() |
| 39 | + if err != nil { |
| 40 | + panic(err) |
| 41 | + } |
| 42 | + rc, err := c.DoRequestAPI(http.MethodPost, endpoint, nil, r) |
| 43 | + if err != nil { |
| 44 | + panic(err) |
| 45 | + } |
| 46 | + defer rc.Close() |
| 47 | + os.Stdout.ReadFrom(rc) |
| 48 | +} |
| 49 | +``` |
47 | 50 | ## Пример запроса с параметрами URL |
48 | 51 | Так как параметры запроса на api "Мегаплан" передаются в нетипичном формате ("*?json=?"), то необходимо их экранировать через url.QueryEscape. |
49 | 52 | Для удобства составления этих параметров можно так же использовать тип __megaplan.QueryParams__. |
50 | | - |
| 53 | +```golang |
51 | 54 | func testGetWithFilters(c *megaplan.ClientV3) { |
52 | 55 | const endpoint = "/api/v3/task" |
53 | 56 | var requestedFiled = [...]string{ |
@@ -141,9 +144,78 @@ https://demo.megaplan.ru/api/v3/docs#entityTask |
141 | 144 | os.Stdout.ReadFrom(response.Body) |
142 | 145 | } |
143 | 146 | } |
| 147 | +``` |
| 148 | + |
| 149 | +## Чтение ответа |
| 150 | +С появлением дженериков улучшена функция для чтения ответов от api. |
| 151 | +Внутри функции есть проверка на Content-Type, если это не json, то в 99% это html с ошибкой. В этом случае функция вернет ошибку с текстом в виде html строки. |
| 152 | + |
| 153 | + |
| 154 | +```golang |
| 155 | +package main |
| 156 | + |
| 157 | +import ( |
| 158 | + "encoding/json" |
| 159 | + "fmt" |
| 160 | + "net/http" |
| 161 | + "strings" |
| 162 | + |
| 163 | + "github.com/stvoidit/megaplan/v3" |
| 164 | +) |
| 165 | + |
| 166 | +const ( |
| 167 | + DOMAIN = `https://example.ru` |
| 168 | + TOKEN = `TOKEN` |
| 169 | + ACCOUNTINFO = `/api/v3/accountInfo` |
| 170 | +) |
| 171 | + |
| 172 | +type AccountInfo struct { |
| 173 | + ID string `json:"id"` |
| 174 | + ContentType string `json:"contentType"` |
| 175 | + PermanentHost string `json:"permanentHost"` |
| 176 | + AccountName string `json:"accountName"` |
| 177 | + BuildVersion string `json:"buildVersion"` |
| 178 | + SystemProductName string `json:"systemProductName"` |
| 179 | + TarifId string `json:"tarifId"` |
| 180 | + LicenceEndDate map[string]any `json:"licenceEndDate"` |
| 181 | + MobileEndDate map[string]any `json:"mobileEndDate"` |
| 182 | + PaidToDate map[string]any `json:"paidToDate"` |
| 183 | + LicenseExpired bool `json:"licenseExpired"` |
| 184 | + MegamailDomain string `json:"megamailDomain"` |
| 185 | + DaysRemaining int `json:"daysRemaining"` |
| 186 | + TimeCreated string `json:"timeCreated"` |
| 187 | +} |
| 188 | + |
| 189 | +func (ai AccountInfo) String() string { |
| 190 | + var sb strings.Builder |
| 191 | + e := json.NewEncoder(&sb) |
| 192 | + e.SetIndent("", " ") |
| 193 | + e.Encode(&ai) |
| 194 | + return sb.String() |
| 195 | +} |
| 196 | + |
| 197 | +func main() { |
| 198 | + c := megaplan.NewClient(DOMAIN, TOKEN, |
| 199 | + megaplan.OptionEnableAcceptEncodingGzip(true), |
| 200 | + megaplan.OptionInsecureSkipVerify(true)) |
| 201 | + res, err := c.DoRequestAPI(http.MethodGet, ACCOUNTINFO, nil, nil) |
| 202 | + if err != nil { |
| 203 | + panic(err) |
| 204 | + } |
| 205 | + // Вы можете указать типа как "any", если вам нужно стандартное поведение json.Decode - возврат в виде map[string]any |
| 206 | + body, err := megaplan.ParseResponse[AccountInfo](res) |
| 207 | + if err != nil { |
| 208 | + panic(err) |
| 209 | + } |
| 210 | + fmt.Println(body) |
| 211 | +} |
| 212 | +``` |
| 213 | + |
144 | 214 |
|
145 | 215 | ## __!__ Про типы и сущности "мегаплана" __!__ |
146 | 216 |
|
| 217 | +\* _не актуально с появлением дженериков_ |
| 218 | + |
147 | 219 | Многие реализации библиотек для API "Мегаплана" пытаются строго типизировать и описать полностью сущности, которыми оперирует "Мегаплан". |
148 | 220 | Однако это подход влечет за собой обязанность этих библиотек поддерживать согласованность с версиями "Мегаплана", а так же каким-то образом поддерживать кастомные варианты полей. |
149 | 221 | Данная библиотека является просто оберткой для использования API v3 и включает минимальное кол-во вспомогательных функций для составления запросов и парсинга ответов. |
|
0 commit comments