
Sad but
04.10.2018
15:41:55

Sergey
04.10.2018
15:42:06

f4rt~
04.10.2018
15:42:13

Sergey
04.10.2018
15:42:16
мы вот щас хотим собрать все текущее мясо, и привести его в порядок. но проблема в том что часто одна и та же сущность в разных местах может быть по-разному представлена. где-то нужны картинки-логотипы, где-то детальная инфа, где-то еще какая-то ебала

Google

Sergey
04.10.2018
15:42:33
разные урлы
больше кода, зато явно, проще поддерживать, проще с обратной совместимостью

f4rt~
04.10.2018
15:42:55

Sergey
04.10.2018
15:43:03
т.е городить какие-то флажки и подобгие graphql это стрельба по ногам

f4rt~
04.10.2018
15:43:05
когда то он почти мне нравился даж(

Sergey
04.10.2018
15:43:09
просто тогда лучше не подобие а graphql

Sergey
04.10.2018
15:44:01
не хочу graphql
?

Bohdan
04.10.2018
15:44:09

Sergey
04.10.2018
15:44:09
grpc прикольнее да

Google

Sergey
04.10.2018
15:44:27

Sergey
04.10.2018
15:44:35
у grpc не очень прикольно с версионностью и шарингом proto файликов

Sergey
04.10.2018
15:44:58

Sergey
04.10.2018
15:45:00
openapi yaml + генератор, выйдет примерно такой же результат

Sergey
04.10.2018
15:45:38
ну то есть версионность, прикольно... вот только обратную совместимость на пол года-год твоей апишки (если у тебя мобильники или внешние клиенты) это не отменяет
а если у тебя и так обратная совместимость - нафига тебе версии?

Sergey
04.10.2018
15:46:08
у нас попроще, у нас только веб фронт, который может только на неделю отставать от бекенда по версии

Sergey
04.10.2018
15:46:19

Sergey
04.10.2018
15:46:31
пока больше проблема со структурами данных

Sergey
04.10.2018
15:48:20
ну пока из моих шишек:
- версионность апи это абман
- nullable first (из свежих концептов которые я раньше не понимал а сейчас понимаю насколько круто)
- все респонсы должны возвращать данные в обертке унифицированной, что бы было проще расширять чуть что. Ну то есть не массивчик или не, упаси сатана, строка, а объектик с полем.
- штуки типа graphql хороши когда у тебя примитивные структуры данных. У меня например есть рекурсивные формы, которые ты никогда и никак не опишешь в терминах graphql
- разные представления данных должны явно быть прописаны на уровне запроса (разные урлы, заголовки, все что угодно что можно на роутер спихнуть)


Sergey
04.10.2018
15:48:27
простой пример, это все что в карте валяется. где-то нужны способы доставки к тому что там валяется, где-то нужны еще и таксы, а где-то для таксов нужно внешний сервис дергать. и вот пока хз как делать, пока думали чета в духе
/cart/1
/cart/1/preview
/cart/1/full
>- все респонсы должны возвращать данные в обертке унифицированной, что бы было проще расширять чуть что. Ну то есть не массивчик или не, упаси сатана, строка, а объектик с полем.
вот тут да. + композиция удобнее чем nullable поля которые хз как заполняются


Sergey
04.10.2018
15:50:57
ну короч, тема сложная, а мне надо работать)

Sergey
04.10.2018
15:51:08
эх, хотел с тебя полезной инфы вытянуть
а ты работать)

f4rt~
04.10.2018
15:51:24

Maksim
04.10.2018
15:51:41
обмажься проекциями и возвращай в зависимости от фазы луны как хочешь)

f4rt~
04.10.2018
15:52:41
https://github.com/moby/moby/blob/master/pkg/namesgenerator/names-generator.go#L820
так в докере генерят имя контейнера

Google

Sergey
04.10.2018
15:52:43
хочется сделать не идеальное апи по всем канонам rest, а удобное. на данный момент оно работает, но глаза режет что есть куча похожих структур одного и того же, но в разном представлении. и в документации это будет не оч смотреться

Sergey
04.10.2018
15:54:56

f4rt~
04.10.2018
15:55:30
слышу HATEOAS"ом
повеяло

Sergey
04.10.2018
15:55:59
JSON RPC забивает болт на http методы и вообще хоть какую-то семантику

Sergey
04.10.2018
15:56:02
или Unified Interface (одно из семи ограничений реста, что бы "это" можно было называть рестом)

Sergey
04.10.2018
15:56:28
у тебя висит эндпоинт, куда ты шлешь {method: createUser, ...}

Sergey
04.10.2018
15:56:32
ну то есть нет никаких стандартов а потому ты забиваешь а не json rpc)
могу ли я POST для обновления заюзать а PUT для создания?

f4rt~
04.10.2018
15:57:48
можно отвечать тем, кому вопрос не адресован?

Sergey
04.10.2018
15:57:56
да, конечно

Sergey
04.10.2018
15:58:05
PUT идемпотентный, POST не очень. а так юзай, в чем проблема)

f4rt~
04.10.2018
15:58:15
оба запроса не безопасные
и так или иначе мофицируют ресурс

Maksim
04.10.2018
15:58:36
обычно человеки делают (если делают) put на добавление изменённой версии, а на post всё прочее.
ну короче кто на что горазд) именно поэтому у меня в апишках ток гет и пост, ибо нехер)

Sergey
04.10.2018
15:58:41
POST не обязан, потому в целом им можно делать вообще все и это будет ок

Google

f4rt~
04.10.2018
15:59:19
безопасный и идемпотентный разные вещи же

Sergey
04.10.2018
15:59:22
просто идемпотентность это круто
и удобно

f4rt~
04.10.2018
15:59:51
там гет безопасный и идемпонетный

Sergey
04.10.2018
16:00:05
руководствуйся чем хочешь - главное что бы апишка была удобной

f4rt~
04.10.2018
16:00:21
твоя правда

Sergey
04.10.2018
16:00:27

Sergey
04.10.2018
16:01:11
разница лишь в том что первое удобнее так как я точно знаю что ты гарантируешь мне идемпотентность операции. А во втором случае - надо уже доки читать и расставлять if-ы в коде. что неудобно
а так я на клиенте могу сделать что-то типа...
if(['GET', 'PUT', 'DELETE'].includes(request.method)) {
return retry(request)
}

f4rt~
04.10.2018
16:02:57
кстати пример с идемпотентностью делита
я честно спиздил у тебя и на каждом собесе рассказываю ыы
в плане что попытка удалить несуществующий ресурс это не LogicException
а успех)

Sergey
04.10.2018
16:04:03
ну.. там могут быть soft delete и он по факту будет всегда существующим)

f4rt~
04.10.2018
16:04:24
ой софт делит это рак вообще(
но я больше имел в виду конкретный пример, когда ты отправил запрос, но не успел получить респонс, допустим интернет в метро пропал и ты отправляешь такой же снова, но только в этот раз у тебя ресурс уже не существует по идентификатору

Sergey
04.10.2018
16:06:48
204 возвращай если ниче не сломалось и все)

Google

Sergey
04.10.2018
16:07:58
и да есть исключения

f4rt~
04.10.2018
16:08:55

Sergey
04.10.2018
16:19:31

f4rt~
04.10.2018
16:20:20
я почему то все равно не могу придумать, в плане если ты что то хочешь удалить, с--цию в которой ты бы проиграл если бы это удалил кто то другой
разве что модераторам каким-то

Sergey
04.10.2018
16:21:22
ну хз, всякие бывают случаи и приходится идти на компромисы)

f4rt~
04.10.2018
16:21:24
которым платят за удаление комментария)

Sergey
04.10.2018
16:21:42
POST /comment/1/delete даже такое в теории может понадобится)

Sergey
04.10.2018
16:24:24

f4rt~
04.10.2018
16:25:02
крч получается почти любой режим гонки

Sergey
04.10.2018
16:25:04
один из моментов - изменение чего-либо можно обыграть как создание события/действия. типа POST /something/{id}/approve

f4rt~
04.10.2018
16:25:08
когда удаление ресурса это какой-то профит

Sergey
04.10.2018
16:28:09
ну в целом это все не так критично
хуже когда в GET происходит изменение, тебе возвращают 200, а в резалте есть некий success: false
запросы на чтение через POST фигачат

f4rt~
04.10.2018
16:29:10
я один раз видел как умудрились завязаться на порядок отдаваемых элементов

Sergey
04.10.2018
16:29:13
и скатываются вот в такие штуки /get-all-users
ну у нас есть все выше перечисленное)