Apollo-link-rest: Capacidade de passar dados para uma solicitação POST

Criado em 16 jun. 2018  ·  3Comentários  ·  Fonte: apollographql/apollo-link-rest

Eu tenho uma API REST existente que requer que os dados sejam postados como JSON. Ele não aceita parâmetros de url. Eu olhei para a documentação, mas não pareço falar sobre isso. Isso é compatível?

Aqui está um exemplo do que estou tentando realizar:

curl -X POST http://localhost:8000/rest-auth/login/ -d '{}'

Desde já, obrigado!

question❔

Comentários muito úteis

Você está certo, bodyKey / input é o que você precisa.

Primeiro: você está passando a entrada para a diretiva, então provavelmente queria:

mutation login ($username: String!, $password: String!) {
  login(input: {username: $username, password: $password}) @rest(
    method: "POST",
    endpoint: "default",
    path: "rest-auth/login/", 
  ) {
    results
  }
}

Mas isso pode não funcionar, acho que temos um bug, onde a “entrada” não pode ser construída dinamicamente como você está fazendo. (Eu adoraria consertar esse bug)

Experimentar:

input LoginInput { # you can omit this whole declaration with ApolloLink Rest
  username: String!
  password: String!
}

mutation login(input: LoginInput!) {
  login(input: $input) @rest(
    method: "POST",
    endpoint: "default", # if you only have 1 endpoint, you can omit this too if you create your rest link the right way
    path: "rest-auth/login/", 
  ) {
    results
  }
}

Este último exemplo é basicamente o que meu aplicativo tem.

Todos 3 comentários

Acho que bodyKey/bodyBuilder é o que eu estava procurando.

Tenho tentado fazer algo assim:

mutation login ($username: String!, $password: String!) {
  login @rest(
    method: "POST",
    endpoint: "default",
    path: "rest-auth/login/", 
    input: {username: $username, password: $password}
  ) {
    results
  }
}

Mas continuo recebendo este erro:

[GraphQL mutation using a REST call without a body]. No `input` was detected. Pass bodyKey, or bodyBuilder to the @rest() directive to resolve this.

Meu link de descanso é parecido com este:

export const restLink = new RestLink({
  endpoints: {
    default: process.env.REACT_APP_HOST_URL,
  },
  headers: {
    "Content-Type": "application/json"
  },
  credentials: "same-origin",
})

Meu cliente se parece com isto:

const client = new ApolloClient({
  link: ApolloLink.from([ stateLink, restLink ]),
  cache: cache,
  defaultOptions,
})

Você está certo, bodyKey / input é o que você precisa.

Primeiro: você está passando a entrada para a diretiva, então provavelmente queria:

mutation login ($username: String!, $password: String!) {
  login(input: {username: $username, password: $password}) @rest(
    method: "POST",
    endpoint: "default",
    path: "rest-auth/login/", 
  ) {
    results
  }
}

Mas isso pode não funcionar, acho que temos um bug, onde a “entrada” não pode ser construída dinamicamente como você está fazendo. (Eu adoraria consertar esse bug)

Experimentar:

input LoginInput { # you can omit this whole declaration with ApolloLink Rest
  username: String!
  password: String!
}

mutation login(input: LoginInput!) {
  login(input: $input) @rest(
    method: "POST",
    endpoint: "default", # if you only have 1 endpoint, you can omit this too if you create your rest link the right way
    path: "rest-auth/login/", 
  ) {
    results
  }
}

Este último exemplo é basicamente o que meu aplicativo tem.

@fbartho - obrigado! Isso esclareceu muito. Você está certo, eu estava acidentalmente inserindo a entrada na diretiva.

Esta página foi útil?
0 / 5 - 0 avaliações