Используя механизм GraphQL, но возвращайте CSV - PullRequest
0 голосов
/ 31 октября 2019

Обычный API REST может позволить вам запрашивать одни и те же данные в разных форматах с другим заголовком Accept, например application/json, или text/html, или ответом в формате text/csv.

Однако, если вы используете GraphQL, кажется, что JSON является единственным приемлемым типом возвращаемого содержимого. Однако мне нужно, чтобы мой API мог возвращать данные CSV для использования менее изощренными клиентами, которые не будут понимать JSON.

Имеет ли смысл для конечной точки GraphQL возвращать данные CSV, если дано Accept: text/csvзаголовок? Если нет, то есть ли лучший практический способ сделать это?

Это скорее концептуальный вопрос, но я специально использую Графен для реализации моего API. Предоставляет ли он какой-либо механизм для обработки пользовательских типов контента?

1 Ответ

0 голосов
/ 31 октября 2019

GraphQL полагается (и светит из-за) отвечающих вложенных данных. Насколько я понимаю, CSV может отображать только пары плоских значений. Это делает CSV не очень подходящим для ответов GraphQL.

Я думаю, что самый простой способ добиться того, что вы хотите сделать, - это поставить клиент GraphQL перед своими клиентами:

+------+  csv  +-------+  http/json  +------+
|client|<----->|adapter|<----------->|server|
+------+       +-------+             +------+

Здесь хорошо то, что ваш адаптер должен был бы иметь возможность только переводить указанные запросы в CSV.

Очевидно, что вы не всегда сможете это сделать (но как вы заставляете их отправлять запросы GraphQL тогда? ). В качестве альтернативы вы можете создать промежуточное программное обеспечение, которое переводит JSON в CSV. Но тогда вам придется иметь дело со всей спецификацией GraphQL. Удачи в переводе этого ответа:

{
  "__typename": "Query",
  "someUnion": [
    { "__typename": "UnionA", "numberField": 1, "nested": [1, 2, 3, 4] },
    { "__typename": "UnionB", "stringField": "str" },
  ],
  "otherField": 123.34
}

Так что, если вы не можете обойтись переносом CSV по HTTP, GraphQL - просто неправильный выбор, потому что он не был создан для этого. И если вы запретите те функции GraphQL, которые трудно перевести на CSV, у вас больше не будет GraphQL, поэтому нет смысла называть его GraphQL.

...