Django REST получает "application/x-www-form-urlencoded" и возвращает "application/xml"

Я пишу интеграцию с платежным шлюзом и у меня возникла проблема с отправкой ответа провайдеру. Они отправляют запрос с данными в форме "application/x-www-form-urlencoded" и ожидают ответа. Вот их заголовки запроса:

{'Content-Length': '917', 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', 'Accept': 'application/xml', 'User-Agent': 'Apache-HttpClient/4.5.13 (Java/11.0.15)', 'Accept-Encoding': 'gzip,deflate', 'Host': '89.xxxxxxxx', 'Via': '1.1 payxxxxxx (squid/3.5.20)', 'X-Forwarded-For': '10.xxxxxx', 'Cache-Control': 'max-age=259200', 'Connection': 'keep-alive'}

Я не знаю, как использовать два класса рендерера в django - один для приема запроса, другой для ответа. Я пытался добавить

parser_classes = (XMLParser,)

но затем он показывает мне ошибку 415 как ответ (Unsupported Media Type).

Rn Я получаю 406 - (Not Acceptable) - {"detail": "Could not satisfy the request Accept header."}

Платежный шлюз отправляет POST-запрос. Моя попытка обработать его была следующей:

class ITNView(APIView):
    #parser_classes = (XMLParser, JSONParser)

def post(self, request):
    body = request.data['transaction'] #form-encoded
    print(body)
    print(request.headers)
    return Response(request.data, content_type="application/xml")

но это не работает

У вас есть идея, как я могу обрабатывать application/x-www-form-urlencoded как данные запроса и отвечать XML?

@xGoldeNx то, что вам нужно - это FormParser. Посмотреть документ можно на странице Django Rest Framework: https://www.django-rest-framework.org/api-guide/parsers/#formparser

Базово

from rest_framework.parsers import FormParser

class ITNView(APIView):
   parser_classes = [FormParser]

Таким образом, данные окажутся в request.data, как вы и ожидали.

Вернуться на верх