Как реализовать частичный ресурс остальных API? - PullRequest
0 голосов
/ 01 апреля 2019

Чтобы ограничить размер моих ответов REST API, я хочу реализовать совет по производительности Google : использование параметра строки запроса fields для частичных ресурсов.

Если у меня есть полный ответ GET https://myapi.com/v1/users

[
 {
   "id": 12,
   "first_name": "Angie",
   "last_name": "Smith",
   "address": {
          "street": "1122 Something St.",
          "city": "A city"
          ..and so on...
    }
  },
  ... and so on
]

Я смогу отфильтровать его GET https://myapi.com/v1/users?fields=first_name

[
  {
   "id": 12,
   "first_name": "Angie"
  },
  ... and so on
]

Концепция довольно проста для понимания, но я не могу найти простой способ ее реализации!

Все мои API-ресурсы спроектированы одинаково:

  • использовать параметры строки запроса для фильтрации, сортировки, подкачки.
  • вызов службы с этими параметрами для выполнения запроса SQL (только условие WHERE, условие ORDER BY и LIMIT являются динамическими)
  • использовать конвертер для форматирования данных обратно в JSON

Но при использовании этого нового параметра fields что мне нужно делать? где я могу отфильтровать данные?

  1. Нужно ли фильтровать только выходные данные JSON? Но я сделаю (в этом примере) нежелательный запрос JOIN для таблицы адресов и получу ненужные поля в таблице пользователей.

  2. Нужно ли делать динамический SQL-запрос для выборки точно запрошенных полей и добавления JOIN только тогда, когда это нужно конечному пользователю? Тогда конвертер должен быть умным, чтобы преобразовать только доступные поля в запросе SQL.

На мой взгляд, это второе решение создаст чрезвычайно динамический, сложный и сложный в обслуживании код.

Итак, как реализовать такой REST API с функцией частичных ресурсов? Что вы лучше всего практикуете в этом случае?

(я разработчик PHP, но я не думаю, что это актуально для этого вопроса)

1 Ответ

0 голосов
/ 01 апреля 2019

Если ваш бэкэнд выполняет

GET https://myapi.com/v1/users

, что приводит к SQL:

select * from users

, который вы затем превращаете в JSON, можете ли вы просто сделать:

GET https://myapi.com/v1/users?fields=first_name,surname,email

получить все необходимые поля (приблизительное представление о реализации PHP):

$fields = split(",", $_GET["fields"]);
$sql = "select ";
foreach ($fields as &$field) {
  // do a check to see if the field is ok first...
  if (checkField($field)) {
    $sql += field + "," // deal with commas
  }
}
$sql += " from users";

для построения SQL, например:

select firstname,surname,email from users

и включить этот ограниченный набор данных в JSON?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...