• REST? Возьмите тупой JSON-RPC
    0

    Эта спецификация предложена ещё в 2009 году.

  • REST? Возьмите тупой JSON-RPC
    0

    Не очень понял вопрос. здесь — это какое место?


    {
        "serviceUrl": "http://subdomain.example.com/api",
        "description": "change back when standard url will work"
    }

    Вот так не получится?

  • REST? Возьмите тупой JSON-RPC
    +1
    На данный момент, по моему личному мнению, преимуществ перед JSON-RPC/REST/GraphQL у него нет

    Преимущества JSON:API перед JSON-RPC те же самые, что и у REST перед JSON-RPC (как и недостатки)


    Преимущества перед REST:


    • стандартизация некоторых холиварных моментов (таких, как пагинация, HTTP-статусы ответов в большинстве случаев)
    • возможность выборки только нужных полей сущности
    • возможность получить только нужные связанные данные

    Преимущества перед GraphQL:


    • отсутствие повторяющихся данных (если мы выбираем N статей с их авторами, в GraphQL для каждой статьи продублируется автор, даже если он один, а JSON:API вернет только уникальных авторов)
  • REST? Возьмите тупой JSON-RPC
    0
    Выглядит юзабельно! К сожалению, плюсик не могу поставить
  • REST? Возьмите тупой JSON-RPC
    0

    Ничто не мешает добавить в сервис поле description

  • REST? Возьмите тупой JSON-RPC
    +2

    Вспоминая о JSON-RPC и документировании API, не забывайте о SMD.


    Например
    {
      "transport": "POST",
      "envelope": "JSON-RPC-2.0",
      "contentType": "application/json",
      "SMDVersion": "2.0",
      "services": {
        "post.list": {
          "transport": "POST",
          "envelope": "JSON-RPC-2.0",
          "parameters": [
            {
              "name": "author",
              "type": "string"
            },
            {
              "name": "token",
              "type": "string",
              "optional": true
            }
          ],
          "returns": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "title": {
                  "type": "string"
                },
                "content": {
                  "type": "string"
                },
                "author": {
                  "type": "string"
                },
                "status": {
                  "type": "string",
                  "enum": [
                    "draft",
                    "published"
                  ]
                }
              },
              "required": [
                "title",
                "content",
                "status",
                "author"
              ]
            }
          },
          "post.create": {
            "transport": "POST",
            "envelope": "JSON-RPC-2.0",
            "returns": {
              "type": "object",
              "properties": {
                "title": {
                  "type": "string"
                },
                "content": {
                  "type": "string"
                },
                "author": {
                  "type": "string"
                },
                "status": {
                  "type": "string",
                  "enum": [
                    "draft",
                    "published"
                  ]
                }
              },
              "required": [
                "title",
                "content",
                "status",
                "author"
              ]
            },
            "parameters": [
              {
                "name": "title",
                "type": "string"
              },
              {
                "name": "content",
                "type": "string"
              },
              {
                "name": "status",
                "type": "string"
              },
              {
                "name": "token",
                "type": "string"
              }
            ]
          }
        }
      }
    }

    При желании можно и какой-нибудь UI оформить, наподобии сваггера

  • PHP-Дайджест № 150 (11 – 25 февраля 2019)
    +3
    Как использовать паттерн «репозиторий» в Laravel

    Но там предлагают просто возвращать те же самые AR-модели… Уж если следовать паттерну, то нужно вводить слой сущностей (DTOшки, или аналог Entity в симфони), которые знать не знают о базе данных...

  • Мягкое удаление в REST API
    +2
    лучше воспользоваться вместо этого методом PUT с телом, включающим в себя что-то вроде {status: 'deleted'}.

    Но ведь метод PUT должен принимать весь объект целиком? Для частичного изменения предусмотрен метод PATCH, или я ошибаюсь?

  • Корпоративный туалет
    +2
    Самое время директору спохватиться и сходить в туалет, проверить Сергея…
  • Роскомнадзор пообещал пилотные проверки «автономного Рунета»
    +3

    Чтобы потом запретить шифрование, видимо

  • Этичность автоматизации активности
    0
    Если я не ошибаюсь, отображается только активность в публичных репозиториях.
  • Этичность автоматизации активности
    0
    Ну я же о рабочем времени… А что касается выходных — тут спорный момент. Такая ситуация (если там нормальные коммиты, а не коммиты ради озеленения активности) может быть показателем как стремления к развитию, так и показателем риска выгорания. Боюсь, я слишком не компетентен для анализа такой ситуации.
  • Этичность автоматизации активности
    +15
    По зеленой полосе гитхаба иногда можно понять, что кандидат занимается немного не тем в рабочее время…

    PS. Прошу прощения, но картинка больно в тему
    Картинка
    image
  • Composer для самых маленьких
    0
    О как! А я всё ручками, да ручками… Спасибо!
  • Composer для самых маленьких
    0
    Раз уж решили описать публикацию в packagist, можно заодно и описать процесс настройки веб-хуков на гитхабе
  • Регулярные выражения для валидации распространенных видов данных
    0
    Имя пользователя (с ограничением 2-20 символов, которыми могут быть буквы и цифры, первый символ обязательно буква):
    ^[a-zA-Z][a-zA-Z0-9-_\.]{1,20}$


    до 21 символа получается…
  • Let's Encrypt начнёт выдавать wildcard-сертификаты в январе 2018 года
    0
    Шёл март 2018го…
  • Недокументированные приемы CSS
    0
    Спасибо! Полезная подборка!
  • Объяснение HTTPS на почтовых голубях
    0
    Если они собираются шифровать «Я тебя люблю» (как в тексте), то они скрывают чуть больше, чем Алиса и Боб :)
  • Танчики в консоли, статья третья: «Сервер и клиент»
    +1
    Не сразу осилил навигацию по репозиторию. А почему бы не сделать версии не бранчами, а тэгами? Ну и на гитхабе есть удобная вкладка «releases» :)
  • Если вы девушка, то стоит ли идти в разработчики. Мой опыт
    –1
    А какое мне дело до статистики? Какая разница, насколько мал процент уходящих в декрет мужчин, если если в этот процент попадёт конкретный человек, которого я взял на работу?
  • Если вы девушка, то стоит ли идти в разработчики. Мой опыт
    0
    Слишком мало исходных данных, чтобы ответить на опрос.
    Если кандидаты показали себя в равной степени и эта степень устраивает, нужен анализ личностных данных.
    В ходе собеседования создается некая картина личности. Ты видишь, комфортно ли тебе общаться с этим человеком, а зная свою команду, можно сделать вывод, насколько комфортно будет себя чувствовать этот человек в коллективе.
    Гендерный признак тут не роляет (в декрет и мужчина может уйти).
  • Мой опыт войти в айти в сравнении с тамбовким таксистом
    +1
    А я в своё время бросил один престижный сибирский университет, в котором учился на геофизика, а потом, после армии, отучился в непрестижном университете и стал айтишником.
    И иногда настолько всё достаёт, что хочется стать геологом и уйти в тайгу копать минералы…
  • Почему мне кажется, что студентов учат ООП неправильно
    +1
    Не очень понял, зачем чертежу методы взлёт(), полет(), посадка()
    Или в конструкторе класса алгоритм складывания самолётика из листа?
  • PSR-7 в примерах
    0
    Вдруг кто не в курсе:

    Некоторые клиенты выдают ошибку при попытке передать в строке GET-запроса массив. Чтобы этого не случилось, нужно квадратные скобки урленкодить ( [ — %5B и ] — %5D)
  • Как правильно оформить Open Source проект
    0
    Ужасного ничего в этом нет. Но, зачем вести .gitignore, если его можно не вести?
  • IP Tool — База данных IP адресов
    0
    Исправил работу индекса, провёл сравнительный тест, результаты уже поинтереснее :)
  • IP Tool — База данных IP адресов
    0
    В моём случае случае, задача по проектированию справочников ложится на пользователя инструмента. В документации я привёл всего лишь пример (хотя признаю, крайне неудачный. Обещаю поправить).
    Что касается связи между справочниками — я пока не придумал, как это реализовать в универсальном механизме. У Вас это решается кодом, но у вас более узкая задача.
  • IP Tool — База данных IP адресов
    0
    и увидел, что при любом ip у вас $stop равен последнему блоку. Т.е. всегда выборка до конца.

    Ого! Вот это я накосячил! Спасибо!
    Также не совсем понял, у вас нет зависимостей между справочниками? Ну чтобы когда находишь город, в этой записи были ссылки на соответствующие записи в справочниках региона и страны.

    У меня нет возможности указать зависимости между справочниками.
    В моём примере информация о городе, регионе и стране хранится в одном справочнике «geo». При желании, можно сделать три справочника (город, регион, страна), что уменьшит размер базы, но увеличит количество дисковых операций при поиске. Но опять же, связь будет только между диапазоном и справочником.
  • IP Tool — База данных IP адресов
    0
    Например, мне нужна не гео-база, а база ip ботов. Или провайдеров. Или вообще, всё вместе. Тогда я собираю одну базу:
    • гео — на основе того же maxmind
    • боты — на основе, к примеру ipgrabber
    • провайдеры — отдельным скриптом собираю инфу в RIPE

    И всё. С помощью этой тулзы я смогу одним запросом получить всю необходимую инфу, а не держать 3 разные библиотеки, не инициализировать их все и не делать к к каждой по запросу.

    Ведь IP база — это не только геолокация…
  • IP Tool — База данных IP адресов
    0
    В MaxMind разве можно добавить свои данные?