HTTP 415 по запросу GraphQL от apollo-client к graphene-python
На стороне сервера работает сервер graphql на основе Starlette. На стороне клиента находится приложение Next.js с apollo-client.
Мы используем useQuery
хук, который должен передавать данные входа OAuth на сервер graphql, где они обрабатываются, и токен JWT будет возвращен, если все в порядке.
Проблема: получение неподдерживаемого типа мультимедиа HTTP 415 при каждом запросе на вход в систему
Серверный код:
login_data = graphene.String(
id=graphene.Int(),
first_name=String(required=True, name="first_name"),
last_name=String(required=False, name="last_name"),
auth_date=Int(required=True, name="auth_date"),
hash=String(required=True),
photo_url=String(required=True, name="photo_url"),
username=String(required=False),
)
class Query(graphene.ObjectType):
login = login_data
hello = graphene.String()
def resolve_login(parent, info, **kwargs):
res = generate_token(kwargs) # Authentication logic which is tested to work
return res
def resolve_hello(parent, info, **kwargs):
return 'Hello'
Клиентский код:
const HELLO = gql`{hello}`
const LOGIN = gql`
query Login ($id: Int!, $last_name: String, $first_name: String!, $hash: String!, $auth_date: Int!, $username: String, $photo_url: String) {
login(
id: $id
last_name: $last_name,
first_name: $first_name,
hash: $hash,
auth_date: $auth_date,
username: $username,
photo_url: $photo_url
) {
token
}
}
`
export default function login() {
const [loginData, setLoginData] = useState({});
const {loading, error, data} = useQuery(LOGIN, {skip: Object.keys(loginData).length === 0, variables: loginData});
В useQuery
логика работает нормально - запросы делаются только после того, как я получаю данные для входа. Подробности запроса ниже.
Полезная нагрузка:
{
"operationName": "Login",
"variables": {
"id": 111111,
"first_name": "firstName",
"last_name": "lastName",
"username": "username",
"photo_url": "https://example.com/photo.jpg",
"auth_date": 1591287901,
"hash": "b8444...fc8"
},
"query": "query Login($id: Int!, $last_name: String, $first_name: String!, $hash: String!, $auth_date: Int!, $username: String, $photo_url: String) {\n login(id: $id, last_name: $last_name, first_name: $first_name, hash: $hash, auth_date: $auth_date, username: $username, photo_url: $photo_url) {\n token\n __typename\n }\n}\n"
}
Заголовки:
Host: 127.0.0.1:8000
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:76.0) Gecko/20100101 Firefox/76.0
Accept: */*
Accept-Language: en-US,ru-RU;q=0.8,ru;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Content-Type: text/plain;charset=UTF-8
Origin: null
Content-Length: 644
DNT: 1
Connection: keep-alive
В то же время простой запрос HELLO
(определено в коде выше) разрешается нормально. Что я делаю не так?