Запрос прокси к серверу graphql через AWS appsync - PullRequest
1 голос
/ 23 февраля 2020

У меня запущен сервер graphql на одном из моих экземпляров EC2. У меня также работает AWS appsyn c, но на данный момент он интегрирован только с несколькими лямбдами.

Я бы хотел подключить мой Appsyn c к серверу graphql, поэтому Appsyn c будет работать как прокси для определенных c запросов / мутаций.

Так со стороны клиента , это будет выглядеть так:

  • Клиент отправляет запрос к appsyn c, скажем, что это выглядит так:
{
  user {
    id
  }
} 
  • Appsyn c определил запрос user, он настроен на прокси-запрос к серверу graphql без каких-либо изменений
  • Сервер Graphql может обрабатывать следующий запрос:
{
  user {
    id
  }
} 

и возвращает результат:

"data": {
  "user": {
    "id": "123456789"
  }
}
  • наконец, Appsyn c возвращает ответ клиенту

Могу ли я настроить Appsyn c в каким образом данный сценарий возможен? Это правильный шаблон для использования Appsyn c для?

Обновление 1. После @ mparis ответ

я смог прокси мой запросите через AppSyn c и обратитесь к моему серверу graphql со следующей конфигурацией распознавателя:

{
    "version": "2018-05-29",
    "method": "POST",
    "resourcePath": "/graphql",
    "params":{
        "body": {
          "query": "$util.escapeJavaScript($ctx.info.getSelectionSetGraphQL())"
        }
    }
}

Но это все равно не работает должным образом - оно отличается от описания в docs и Я вижу по крайней мере две проблемы:

  1. Если у меня есть запрос с аргументами и вложенным paylod, $ctx.info.getSelectionSetGraphQL() вырезает часть имени и аргументов запроса и дает мне только вложенную полезную нагрузку, поэтому этот запрос:
{ 
  user(id: "1") {
    picture {
      url
    }
}

становится следующим, когда я звоню $ctx.info.getSelectionSetGraphQL():

{
   picture {
     url
   }
}

Но я бы хотел использовать весь запрос, как описано в документации:

"selectionSetGraphQL": "{\n  getPost(id: $postId) {\n    postId\n    title\n    secondTitle: title\n    content\n    author(id: $authorId) {\n      authorId\n      name\n    }\n    secondAuthor(id: \"789\") {\n      authorId\n    }\n    ... on Post {\n      inlineFrag: comments {\n        id\n      }\n    }\n    ... postFrag\n  }\n}"
Допустим, у меня есть запрос, и я определил распознаватель для запроса user в appsyn c, запрос выглядит так:
{ 
  user(id: "1") {
    picture {
      url
    }
}

, и я вызываю свой graphql бэкэнд через appsyn c, в моих журналах graphql я вижу следующий зарегистрированный ответ:

{
  "data: {
    "user": {
      "picture": {
        "url": "example.com/link/to/a/picture"
      }
    }
  }
}

но appsyn c возвращает мне данный ответ вместо:

{
  "data: {
    "user": {
      "picture": null
    }
  }
}

Я понял из этого appsyn c ожидает от меня, что я определю средства распознавания для запросов user и picture. Appsyn c хочет сначала вызвать user, а затем picture запрос, но я просто проксирую ответ через appsyn c, не вызывая дополнительных запросов, кроме user. Все оценивается в моем бэкэнде graphql и должно быть просто помещено в тело ответа, но appsyn c хочет оценить все еще раз.

Есть ли какое-либо решение для 1 и 2?

1 Ответ

0 голосов
/ 24 февраля 2020

На момент написания вы можете использовать объект $ctx.info, чтобы получить набор запросов из резолвера и отправить соответствующие данные через резолвер HTTP для вашей нисходящей службы. Go здесь и ищите информационное поле объекта $ ctx. Чтобы это работало, вам нужно будет отразить схему вашего нижестоящего API в вашем AppSyn c API.

Спасибо, что подняли это. Команда знает об этих случаях использования, и это помогает расставить приоритеты.

...