Признание данных поля POST без формы (REST api) с использованием Django

В документации django говорится:

HttpRequest.POST

Словарь-подобный объект, содержащий все заданные параметры HTTP POST, при условии, что запрос содержит данные формы. См. Документацию QueryDict ниже. Если вам нужно получить доступ к необработанным или неформальным данным, размещенным в запросе, используйте это вместо атрибута HttpRequest.body.

Однако сервер не отвечает на браузер (например, с использованием фреймворка JS или формы), но вместо этого REST api отправляется приложением Anroid/iOS.

Если клиент отправляет поля непосредственно в запрос POST, как я могу прочитать данные? Например, это (Java + Unirest):

Unirest.post("/path/to/server")
       .field("field1", "value2")
       .field("field2", "value2");

EDIT: Можно ли просто прочитать данные с помощью response.POST["field1"], или мне нужно что-то сделать с помощью request.body?

EDIT 2: Поэтому я могу просто использовать request.body как объект, подобный словарю, похожий на request.POST?

Ответы

Ответ 1

Насколько я понимаю, метод поля из Unirest просто использует обычные данные application/x-www-form-urlencoded, такие как HTML-форма. Таким образом, вы должны просто использовать response.POST["field1"], как вы предполагали.

Ответ 2

Если api, с которым вы взаимодействуете, является представлением класса Django на основе sipmle, вы получаете доступ к данным через request.body примерно так:

class MyView(View):
    def post(self, request):
        field1 = request.body.get('field1')
        field2 = request.body.get('field2')
        ... # processing here

Если вы используете Django rest framework api, вы получаете доступ к данным через request.data:

field1 = request.data.get('field1')
field2 = request.data.get('field2')

NB: Если вы нашли, что request.data используется где-то в Интернете, это тоже верно, но оно действует только для старой версии DRF, и оно устарело в пользу request.data в более новых версиях.

Ответ 3

Из docs:

request.data возвращает анализируемое содержимое тела запроса. Это аналогичные стандартным атрибутам request.POST и request.FILESкроме того:

  • Он включает в себя весь разобранный контент, включая файловые и нефайловые входы.
  • Он поддерживает разбор содержимого HTTP-методов, отличных от POST, что означает, что вы можете получить доступ к содержимому PUT и PATCH
    Запросы.
  • Он поддерживает гибкий синтаксический анализ запросов REST, а не просто поддерживает данные формы. Например, вы можете обрабатывать входящие JSON так же, как вы обрабатываете входящие данные формы.

Можно ли просто прочитать данные с помощью response.POST["field1"], или я буду нужно что-то сделать с помощью request.body?

Поэтому я могу просто использовать request.body как словарь-подобный объект, аналогичный до request.POST?

Пример. Из метода create (viewsets):

user = dict(
                full_name=request.DATA['full_name'],
                password=request.DATA['password'],
                email=request.DATA['email'],
                personal_number=request.DATA['personal_number'],
                user_type=request.DATA['user_type'],
                profile_id=request.DATA['profile_id'],
                account_id=request.DATA['account_id']
            )

Изменить 1: В версии 3 (последний) - request.data был заменен на request.data:

user = dict(
                    full_name=request.data['full_name'],
                    password=request.data['password'],
                    email=request.data['email'],
                    personal_number=request.data['personal_number'],
                    user_type=request.data['user_type'],
                    profile_id=request.data['profile_id'],
                    account_id=request.data['account_id']
                )