Daniel
надо конкретизировать вопрос
abcd
Устройство p2p, пример любой p2p сети на go
Aleksey
https://github.com/meshbird/meshbird может?
Aleksey
Такое ещё было https://4gophers.ru/articles/vpn-eto-prosto/#.W3gpgmhn00M непонятно что конкретно надо
Vadim
https://github.com/libp2p/go-libp2p
Aleksey
Устройство p2p, пример любой p2p сети на go
Тук. Забыл ответом написать :)
Daniel
там в подкладке webrtc, которого на чистом go нет
Anonymous
предположим я хочу заимплементить в свое приложение выбор master/slave при этом https://github.com/rqlite/rqlite это слишком много (мне не нужна полноценная база данных на консенсусе) и https://github.com/hashicorp/raft это слишком мало (мне не хочется самому прописывать логику "что делать если потерялся мастер" и вообще девелопить отдельную либу, хочется продакшн-реди) что порекомендуете чисто для выбора мастера нецентрализованонго без сервис-дискавери (не через consul/redis/etcd/..., сервисы знают ip друг друга), такую себе либу "подключил и забыл"
Заур
Народ, когда твой сервис в http запросе возвращает json, обычно же, при ошибки на сервере, возвращают что-то типо status: "bad", и error:"someerror". А в случае успешного следует всегда возвращать status:"ok" или считается, что http статуса должно хватать?
Заур
Где вообще можно узнать про практики json ответов
Dmitry
http status должно хватать, можно в каждый ответ засовывать message с описанием
Dmitry
http://jsonapi.org/ это типа спецификаци
Dmitry
но имхо оверхед
Заур
О, спасибо
Yehor
RESTful правил будет достаточно
Anonymous
http://jsonapi.org/ это типа спецификаци
выглядит (по гитхабу) как будто еще в 15-м году на эти спеки забыли
Dmitry
мы как то начали смотерть в эту сторону, посмотрев всякие links, решили не заморачиватся. но ответы для себя найти кое-какие можно
Anonymous
Где вообще можно узнать про практики json ответов
в целом формат ответов зависит от того как сервер общается с клиентом (если мы только про REST говорим), лучших практик нет есть только холивары 🙂 я например нашел удобным дублировать http-ошибку в ответе и еще добавлять статускод (стандартных http-кодов обычно не хватает когда клиенту нужно обрабатывать дополнительные логики - например 401 Unauthorized может быть как "токен неправильный вообще" так и "токен истек" и тп) поэтому, ошибки выглядят у меня примерно так: { message: "human-readable error", status: http-status-code, code: "COMPUTER-READABLE-ERROR-CODE" } ответы на POST/PUT выглядят так: { success: true, id: "resource-created-id" } ответы на GET - любой JSON в рамках того что мы хотим отдать клиенту однако, вы захотите добавлять дополнительные данные - пейджинацию например, количество документов общее и тп: и тогда вы или будете их заголовками передавать, или заранее заложитесь на стандартный ответ (тут уже вам выбирать как удобнее, но лучше делать с запасом чтобы потом версию API не менять и разные не поддерживать): { data: { json-response }, total: total_amount_of_resources, next: "cursor-id-to-fetch-next-portion", ... }
Anonymous
но вообще, я думал тут все на gRPC фигачат? 🙂
Заур
в целом формат ответов зависит от того как сервер общается с клиентом (если мы только про REST говорим), лучших практик нет есть только холивары 🙂 я например нашел удобным дублировать http-ошибку в ответе и еще добавлять статускод (стандартных http-кодов обычно не хватает когда клиенту нужно обрабатывать дополнительные логики - например 401 Unauthorized может быть как "токен неправильный вообще" так и "токен истек" и тп) поэтому, ошибки выглядят у меня примерно так: { message: "human-readable error", status: http-status-code, code: "COMPUTER-READABLE-ERROR-CODE" } ответы на POST/PUT выглядят так: { success: true, id: "resource-created-id" } ответы на GET - любой JSON в рамках того что мы хотим отдать клиенту однако, вы захотите добавлять дополнительные данные - пейджинацию например, количество документов общее и тп: и тогда вы или будете их заголовками передавать, или заранее заложитесь на стандартный ответ (тут уже вам выбирать как удобнее, но лучше делать с запасом чтобы потом версию API не менять и разные не поддерживать): { data: { json-response }, total: total_amount_of_resources, next: "cursor-id-to-fetch-next-portion", ... }
Ого, спасибо за подробный ответ
Anonymous
если вступаете на скользкую дорожку REST - сильно советую сразу начать правильно делать с использованием https://github.com/OAI/OpenAPI-Specification 🙂
Anonymous
тогда не придется вручную писать документы для клиентских разработчиков например, а можно будет заюзать автогенерацию: https://github.com/Rebilly/ReDoc
Anonymous
ну и в продвинутых техниках - валидация входящих/исходящих запросов через json schema без лишней логики на сервере 🙂
Заур
Ох, столько навалили, теперь надо во всём этом копаться 😀
Заур
Спасибо
A
Народ, когда твой сервис в http запросе возвращает json, обычно же, при ошибки на сервере, возвращают что-то типо status: "bad", и error:"someerror". А в случае успешного следует всегда возвращать status:"ok" или считается, что http статуса должно хватать?
Зависит от того какая гибкость требуется от системы. Http выступает в роли транспорта для твоего апи, если в будущем ты захочешь сменить транспорт - например использовать очередь сообщений, или сделать апи асинхронным, когда стандартная http модель запроса и ответа не подходит, твой протокол сообщений не сможет удовлетворять требованиям
Constantine️
а то один ленится доку писать, а потом вся команда в говно наступила
Anonymous
а то один ленится доку писать, а потом вся команда в говно наступила
обратите внимание на рекомендацию использовать openapi3.0 aka ex-swagger
Anonymous
в этом случае дизайн ферст как раз - эту спеку хошь бэкенд описывай, хошь фронтенд, а хошь все вместе включая секретаршу 🙂
Constantine️
наоборот же
Leonid
Спат
Leonid
Нада
Artem
в целом формат ответов зависит от того как сервер общается с клиентом (если мы только про REST говорим), лучших практик нет есть только холивары 🙂 я например нашел удобным дублировать http-ошибку в ответе и еще добавлять статускод (стандартных http-кодов обычно не хватает когда клиенту нужно обрабатывать дополнительные логики - например 401 Unauthorized может быть как "токен неправильный вообще" так и "токен истек" и тп) поэтому, ошибки выглядят у меня примерно так: { message: "human-readable error", status: http-status-code, code: "COMPUTER-READABLE-ERROR-CODE" } ответы на POST/PUT выглядят так: { success: true, id: "resource-created-id" } ответы на GET - любой JSON в рамках того что мы хотим отдать клиенту однако, вы захотите добавлять дополнительные данные - пейджинацию например, количество документов общее и тп: и тогда вы или будете их заголовками передавать, или заранее заложитесь на стандартный ответ (тут уже вам выбирать как удобнее, но лучше делать с запасом чтобы потом версию API не менять и разные не поддерживать): { data: { json-response }, total: total_amount_of_resources, next: "cursor-id-to-fetch-next-portion", ... }
Почему я так часто вижу, что возвращается абстрактное success поле, которое не несёт смысловой нагрузки
Anonymous
наоборот же
Ну в этой интерпретации - да, я сформулировал не так. Кодогенерацию не люблю поэтому юзаю спеку только для валидации и _генерации документации автоматически_
Anonymous
Почему я так часто вижу, что возвращается абстрактное success поле, которое не несёт смысловой нагрузки
Что то нужно возвращать. Удобно в тестах проверять поле, клиенты могу доппроверку сделать. Такое соглашение "система приняла ответ, обработала и ответила в установленом порядке"
Anonymous
Но это не обязательно конечно
Artem
Что то нужно возвращать. Удобно в тестах проверять поле, клиенты могу доппроверку сделать. Такое соглашение "система приняла ответ, обработала и ответила в установленом порядке"
А то, что id пришло может означать что все пошло крахом? Если хочется отдать статус, то любят какой-нибудь статус-код и соответствующее сообщение, а не просто да/нет
Anonymous
А то, что id пришло может означать что все пошло крахом? Если хочется отдать статус, то любят какой-нибудь статус-код и соответствующее сообщение, а не просто да/нет
смотрите, в REST в основном 4 глагола: GET/POST/PUT/DELETE стандартные коды ответа при успехе (при ошибках другие) следующие: - GET возвращает 200 и боди данные которые вы туда вложите - DELETE возвращает 204 и в боди данные можно не возвращать (по спецификации код 204 это no content) - PUT возвращает 201 и в боди нужно что-нибудь написать, { success: true } или { vasya: durak} - что вам удобнее - POST возвраащет 201 и в боди рекомендуют возвращать id сущности которая создана этим постом (чтобы клиент знал ее и мог к ней обращаться), то есть { success: true, id: xxx} или { vasya: durak, id: xxx} или { id: xxx}
Anonymous
но правил не существует, и вы можете в PUT/POST вернуть код 204 и не отдавать body совсем если клиентам норм 🙂 вопрос только соглашений и удобства ими пользования
Artem
С рестом то все понятно, а делают так везде
Anonymous
что именно, излишняя информативность в ответах помимо statuscode?
Artem
Только поле success true/false
abcd
Нужно сделать что-то вроде децентрализованного хранилища файлов (файлы хранятся по частям у всех пользователей сети) Как это реализовать? С блэкджеком и p2p
Me
Если уж сильно хочется, то в любом случае придется держать сервер с метаданными
Anonymous
У меня есть структура Альбом, и у каждого альбома может быть массив песен. Как через mgo.v2 добавить вложенный массив?
Anonymous
https://gist.github.com/zhanswift/d86cda8a3b374795a0710140f409795d
Anonymous
func CreateAlbumEndPoint(w http.ResponseWriter, r *http.Request) { defer r.Body.Close() var album Album if err := json.NewDecoder(r.Body).Decode(&album); err != nil { fmt.Println("Err 1") respondWithError(w, http.StatusBadRequest, "Invalid request payload 1") return } if err := dao.Insert(album); err != nil { fmt.Println("Err 2") respondWithError(w, http.StatusInternalServerError, err.Error()) return } respondWithJson(w, http.StatusCreated, album) }
Anonymous
вот так добавляю из API
Anonymous
Подскажите, пожалуйста, по ide goland - на любой импорт показывает ошибку типа`build constraints exclude all Go files in '/home/oz/go/src/github.com/stretchr/testify/assert' Inspection info: Reports invalid imports.` При этом сами файлы компилируются и исполняются. Импортируемые пакеты устанавливались через команду go get. GOPATH = "/home/oz/go". Тэга вида // +build нет.
Anonymous
go-kit или micro? ;)
Artem
go-kit или micro? ;)
Для чего?
Kirill
go-kit или micro? ;)
go-kit не нужен
Constantine️
😄
Constantine️
go-swagger из этих двух
Michail
kite ваще
Pawel
Хочу странного. Юзер нажимает на хтмл форме копку ГУДБАЙ, в сервер сабмитится урл, по которому сервер выдаёт прощальное сообщение и стопается. Как бы этот по проще провернуть?
Vasily
w.Write(...) os.Exit(0)
Vasily
ну или можно по таймеру в отдельной горутине
Pawel
ну это да. А сам http listener ни как нельзя прервать по софтовому?
Vasily
кстати да, можно
Vasily
у него есть метод Shutdown
Pawel
о! спсб, не увидел)
Constantine️
а потом докер перезапустит ))
Aleksandr
пет проджект перевел на go modules. В принципе работает и придется юзать, но ощущение, что разрабы го любят придумывать велосипеды, не присматриваясь к готовым реализациям из других языков. А потому получается что-то странное
Aleksandr
в частности я не могу добавить сторонний модуль в go.mod и подкачать зависимости
Aleksandr
потому как при добавлении зависимости, не соблюдающей семвер (а это 95% го-либ), коммит репозитория ресолвится в псевдоверсию вида v0.0.0-[commit utc time]-[small commit hash], который вручную собирать замучаешься
Aleksandr
ну а так ок, работает без gopath
Aleksandr
если вы ожидали концепцию списка зависимостей и отдельно lock-файла с разресолвенным деревом зависимостей (как это сделано во всех языках), то нет. Тут нас ждет только lock (он же go.mod) файл с деревом зависимостей.
Aleksandr
плюс go.sum (список хэшей зависимостей для security)
Pawel
Оффтоп. Готовый промышленный аппликативный брейнфак https://github.com/aemkei/jsfuck Любую программу на жс можно закодировать 6 символами: []! ()+
Илья
Такой вопрос, кроме как с glide можно ли завендорить пакеты которые лежат в приватном git репозитории на не стандартном порту? dep или vgo так может?