Недавно я получил задание на собеседование, где мне нужно было разработать приложение React с использованием GraphQL API. Рассматриваемый API — это API SpaceX GraphQL. В рамках задачи мне нужно было получить определенные поля, такие как название миссии, изображение патча миссии, дату запуска и статус успеха (логическое значение) для каждого запуска.
Но при запросе к API я столкнулся с проблемой, когда некоторые поля, в частности «launch_success» и «mission_patch», возвращали нулевые значения. После дальнейшего изучения я понял, что эта проблема распространяется и на другие области.
Ниже я привел пример запроса:
query Launches {
launches {
mission_name
rocket {
rocket_name
}
mission_id
launch_success
}
}
В этом запросе поле launch_success всегда возвращает нулевые значения, но это не так, поскольку когда я использовал REST API, было 80% успешных запусков. Поскольку я новичок в GraphQL, я не уверен в причинах этой проблемы и способах ее устранения.
Может ли кто-нибудь предложить какую-либо информацию о том, почему определенные поля возвращают нулевые значения, и предложить потенциальные шаги по устранению неполадок или исправления? Буду признателен за любые рекомендации!
P.S. Я уже пробовал то же самое с REST API и смог без проблем получить все значения (интервьюер предоставил оба решения, но мне нужно сделать это с помощью GraphQL)
Используемая площадка GraphQL: https://studio.apollographql.com/public/SpaceX-pxxbxen/variant/current/explorer
Я попробовал несколько стратегий для получения необходимых данных из API GraphQL, включая запросы к различным полям и использование различных структур запросов. В частности, я пробовал выполнять запросы launch_success с разных конечных точек и исследовал альтернативные поля, которые могли бы предоставить аналогичную информацию. Однако при каждой попытке поле launch_success всегда возвращало нулевые значения.





В вашем запросе GraphQL нет ничего плохого. В GQL недопустимо, чтобы выбор любого другого поля мог повлиять на другое. Если это null, то это null с точки зрения сервера.
Я вполне уверен, что вы нашли ошибку в API SpaceX GQL. Схема GQL не объявляет это поле (или многие из них, если они вообще есть) как не допускающие значения NULL, то есть код вашего приложения должен обрабатывать, если эти поля имеют значение null. Однако то, почему оно равно нулю, если вы подтвердили существование данных другими способами, может быть проблемой только со стороны SpaceX.
Это также легко продемонстрировать, даже без очевидного наличия данных в REST API, если вы возьмете поле GQL details. Затем вы получите такие результаты, как:
{
"details": "Engine failure at 33 seconds and loss of vehicle",
"launch_date_utc": "2006-03-24T22:30:00.000Z",
"launch_success": null
},
Что ясно показывает недостающие данные. Этот запуск не удался. Это соответствует действительности, поэтому разумно предположить, что существует проблема с API. В сочетании с данными о REST API это в значительной степени убедительно.
Я бы все равно создал код внешнего интерфейса для обработки всех трех возможных значений: null («Неизвестно»), true («Успех») и false («Ошибка»). Даже если он никогда не запускает последние два с текущими наборами данных. Это гарантирует, что вы выполнили свою работу, и код будет работать и обрабатывать все случаи, если ошибка будет исправлена на их стороне.
Например, вы можете создать перекрестную ссылку на один запуск (один и тот же идентификатор) из данных API REST и GQL и продемонстрировать разницу в значениях. Это то, что вы, будучи хорошим инженером, сделали бы в реальной жизни. Я буду впечатлен!
(У других кандидатов будет эта проблема, и поэтому возможность справиться с ней лучше всего, не только в коде, но и на человеческом и коммуникационном уровне, может стать для вас неожиданным бонусом)
Кроме того, это на самом деле дает вам возможность продемонстрировать некоторые навыки решения проблем. Я хотел бы заранее объяснить по электронной почте, что вы считаете, что это поле ошибочно равно нулю из-за проблемы с API SpaceX GQL, и что вполне может быть ошибка в API GQL (приведите все объяснения, которые вы дали). Попросите их дважды проверить то, что соответствует их пониманию, а затем предложите некоторые обходные пути, которые позволят вам выполнить задачу заранее, например, возможно, имитируя значение на данный момент, или используя водопадный вызов отдыха только для этого поля. Это демонстрирует прагматизм и активный подход.