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!
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.
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:
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:
Este último exemplo é basicamente o que meu aplicativo tem.