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, как вы и ожидали.