Доступ к массиву json в AWS AppSync - PullRequest
1 голос
/ 12 февраля 2020

Я новичок в AWS AppSyn c и пытаюсь использовать конечную точку HTTP для извлечения данных из внешнего API. Вот пример того, что возвращает этот API.

{
  "status": 1,
  "size": 3,
  "result": [
    {
      "number": "123",
      "program": "program name",
      "team_name": "team name",
      "robot_name": "robot name",
      "organisation": "team organization",
      "city": "team city",
      "region": "team state",
      "country": "team country",
      "grade": "team grade",
      "is_registered": 0
    },
    {
      "number": "456",
      "program": "program name",
      "team_name": "team name",
      "robot_name": "robot name",
      "organisation": "team organization",
      "city": "team city",
      "region": "team state",
      "country": "team country",
      "grade": "team grade",
      "is_registered": 0
    },
    {
      "number": "789",
      "program": "program name",
      "team_name": "team name",
      "robot_name": "robot name",
      "organisation": "team organization",
      "city": "team city",
      "region": "team state",
      "country": "team country",
      "grade": "team grade",
      "is_registered": 0
    }
  ]
}

Вот моя схема GraphQL

type Query {
    getTeams(number: String!): Team
}

type Team {
    number: String
    program: String
    teamName: String
    robotName: String
    organization: String
    city: String
    region: String
    country: String
    grade: String
    isRegistered: Int
}

schema {
    query: Query
}

Вот мой шаблон отображения запросов

{
    "version": "2018-05-29",
    "method": "GET",
    "resourcePath": "/v1/get_teams",
    "params":{
        "query": {
            "APIKEY": "API_KEY_GOES_HERE"
        },
        "headers": {
            "Content-Type": "application/json"
        }
    }
}

А здесь мой шаблон отображения ответов

#if($context.result.statusCode == 200)
## Success - decode the body and reconstruct the response with the schema in mind
#set($response = $util.parseJson($context.result.body))

#set($result = {
 "number": $response.result[0].number,
 "program": $response.result[0].program,
 "teamName": $response.result[0].team_name,
 "robotName": $response.result[0].robot_name,
 "organization": $response.result[0].organisation,
 "city": $response.result[0].city,
 "region": $response.result[0].region,
 "country": $response.result[0].country,
 "grade": $response.result[0].grade,
 "isRegistered": $response.result[0].is_registered
})
$util.toJson($result)
#else
## Error - send the proper error message
$utils.appendError($ctx.result.body, $ctx.result.statusCode)
#end

То, что я в настоящее время работал, но возвращает только одну команду. Мой вопрос заключается в том, как мне получить запрос GraphQL, чтобы он возвращал массив команд, получая все элементы из массива результатов в файле JSON?

1 Ответ

1 голос
/ 13 февраля 2020

Я не уверен, что я действительно понял, чего вы пытаетесь достичь, но здесь это так:

Если вы хотите вернуть массив команд вместо одной команды, вам нужно изменить свой запрос в схеме следующим образом:

type Query {
    getTeams: [Team]
}

Теперь в отображении ответов вы можете напрямую отобразить ответ в ваш массив:

#if($ctx.result.statusCode == 200)
    ## If response is 200, return the body.
    $util.toJson($util.parseJson($ctx.result.body).result)
#else
    ## If response is not 200, append the response to error block.
    $utils.appendError($ctx.result.body, "$ctx.result.statusCode")
#end

В этот момент я заметил, что вы переименовали поля в ваша схема, так что она больше не соответствует; например, ваш json возвращает team_name, но ваша схема graphQL ожидает teamName.

Что бы я сделал, чтобы изменить схему, чтобы она соответствовала JSON, как указано ниже:

type Team {
    number: String
    program: String
    team_name: String
    robot_name: String
    organisation: String
    city: String
    region: String
    country: String
    grade: String
    is_registered: Int
}

А затем используйте псевдоним в запросе, чтобы вернуть поля с ожидаемым именем, например:

query{
  getTeams{
    number: number
    teamName:team_name
    robotName: robot_name
    organization: organisation
  }
}

Это даст результат, который, я думаю, вы ожидаете:

{
  "data": {
    "getTeams": [
      {
        "number": "123",
        "teamName": "team name",
        "robotName": "robot name",
        "organization": "team organization"
      },
      ....

...