Клиент Apollo: как запросить конечную точку rest с помощью строки запроса?

#react-apollo #apollo-client #apollo-link-rest

#реагировать-apollo #apollo-client #apollo-link-rest

Вопрос:

Я использую Apollo для вызова конечной точки rest, которая принимает переменные из строки запроса:

/api/GetUserContainers?showActive=trueamp;showSold=true

У меня возникли проблемы с пониманием того, как передавать переменные в запрос, чтобы затем он мог вызвать правильный URL. Из просмотра документов apollo-link-rest и нескольких вопросов, которые, я думаю, я должен использовать pathBuilder , но это не задокументировано, и я не смог заставить его работать.

До сих пор я определял свой запрос следующим образом:

 getUserContainersQuery: gql`
  query RESTgetUserContainers($showActive: Boolean, $showSold: Boolean, $pathBuilder: any) {
    containerHistory @rest(type: "ContainerHistoryResponse", pathBuilder: $pathBuilder) {
      active @type(name: "UserContainer") {
        ...ContainerFragment
      }
      sold @type(name: "UserContainer") {
        ...ContainerFragment
      }
    }
  }
  ${ContainerFragment}
`
  

и вызываю его в моем компоненте вот так, что не работает:

 import queryString from 'query-string'

// ...

const { data } = useQuery(getUserContainersQuery, {
  variables: {
    showActive: true,
    showSold: false,
    pathBuilder: () => `/api/GetUserContainers?${queryString.stringify(params)}`,
  },
  fetchPolicy: 'cache-and-network',
})
  

Единственный способ заставить это работать — передать полностью созданный путь к запросу из компонента:

 // query definition

getUserContainersQuery: gql`
  query RESTgetUserContainers($pathString: String) {
    containerHistory @rest(type: "ContainerHistoryResponse", path: $pathString) { // <-- pass path here, instead of pathBuilder
      // same response as above
    }
  }
`

// component

const params = {
  showActive: true,
  showSold: false,
}

const { data } = useQuery(getUserContainersQuery, {
  variables: {
    pathString: `/api/GetUserContainers?${queryString.stringify(params)}`,
  },
  fetchPolicy: 'cache-and-network',
})
  

Мне кажется, это действительно хакерское решение, которого я бы хотел избежать.

Каков рекомендуемый способ решения этой проблемы со строкой запроса?

Ответ №1:

Вам не нужно использовать pathBuilder для простых параметров строки запроса. Вы можете передавать свои параметры непосредственно как переменные useQuery , а затем передавать их непосредственно в teh path , используя {args.somearg} синтаксис. Проблема, которую я вижу, заключается в том, что вы не определили переменные, которые вы используете для запроса containerHistory bu, только в псевдониме запроса RESTgetUserQueries . Если обновлено, это должно выглядеть так:

 
// query definition

getUserContainersQuery: gql`
  query RESTgetUserContainers($showActive: Boolean, $showSold: Boolean) {
    // pass the variables to the query
    containerHistory(showActive:$showActive, showSold:$showSold) @rest(type: "ContainerHistoryResponse", path:"/api/GetUserContainers?showActive={args.showActive}amp;showSold={args.showTrue}") { 

     //.. some expected reponse

    }
  }
`

// component

const params = {
  showActive: true,
  showSold: false,
}

const { data } = useQuery(getUserContainersQuery, {
  variables: {
    showActive, 
    showSold
  },
  fetchPolicy: 'cache-and-network',
})
  

Комментарии:

1. Спасибо за ответ, это решило мою проблему. Вы знаете, где это может быть задокументировано?

2. Это загадочно задокументировано здесь: apollographql.com/docs/link/links/rest в разделе «Полные параметры директивы @rest». По общему признанию, даже из их примера не на 100% ясно, что это работает именно так!

3. @Rennzie что, если у нас есть условие, при котором, если параметры запроса не определены, его не следует отправлять. Есть идеи, как мы можем этого добиться??