@symfony_php

Страница 1366 из 1418
f4rt~
04.10.2018
15:42:13
никаких
херово

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

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

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

Sergey
04.10.2018
15:43:09
я помню когда то фракталом пытался такое привести в норму
ну вот у меня на предыдущих проектах был переписанный немного фрактал

т.е городить какие-то флажки и подобгие graphql это стрельба по ногам
нет, подобие graphql (когда у тебя вся инфа о том что ты хочешь получить есть в запросе + все nullable по дефолту) - это хорошо

просто тогда лучше не подобие а graphql

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

?

Bohdan
04.10.2018
15:44:09
просто тогда лучше не подобие а graphql
а ещё лучше, когда ещё и фронтовые типы генерятся)

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
у grpc не очень прикольно с версионностью и шарингом proto файликов
версионность - оч сомнительная фича. честно говоря я не думаю что версионность API это вообще хорошая идея

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: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
эх, хотел с тебя полезной инфы вытянуть

а ты работать)

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
хочется сделать не идеальное апи по всем канонам rest, а удобное. на данный момент оно работает, но глаза режет что есть куча похожих структур одного и того же, но в разном представлении. и в документации это будет не оч смотреться
REST это когда у тебя html, ссылки и формы и сервер полностью управляет переходами между состоянием (потому оно REpresentational State Transfer). Как только у тебя на клиенте хоть что-либо хардкодится (урлы, структуры данных) - у тебя уже не REST. Это не хорошо и не плохо - просто тебе не нужен REST. Тебе нужно JSON RPC

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)

у тебя висит эндпоинт, куда ты шлешь {method: createUser, ...}
ну расскажи мне про семантику POST и PUT. Что когда юзать?

могу ли я 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
PUT идемпотентный, POST не очень. а так юзай, в чем проблема)
ты достиг просветления. Теперь я знаю что ты знаешь что делаешь)

оба запроса не безопасные
нет, PUT обязан быть безопасным (идемпотентным)

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

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

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

и удобно

безопасный и идемпотентный разные вещи же
ну так и GET тогда не безопасный потому что тебе хуйня может придти)

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
ты достиг просветления. Теперь я знаю что ты знаешь что делаешь)
ну ты вообще понял о чем я говорил изначально же я к тому что /cart/delete?=1 или /user?approve=1, или когда выборки с post делают, позаменять на более адекватные варианты

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
ну.. там могут быть soft delete и он по факту будет всегда существующим)
я просто на клиенте не хочу обрабатывать ошибку если я хотел удали а уже кто-то удалил. Оно в том состоянии в котором я хотел - значит все хорошо

и да есть исключения

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
можешь привести пример?)
ну когда не идемпотентно. но тут больше пример @Enleur выше

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

ну у нас есть все выше перечисленное)

Страница 1366 из 1418