Ответ 1
Насколько я понимаю, метод поля из Unirest просто использует обычные данные application/x-www-form-urlencoded
, такие как HTML-форма. Таким образом, вы должны просто использовать response.POST["field1"]
, как вы предполагали.
В документации 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
?
Насколько я понимаю, метод поля из Unirest просто использует обычные данные application/x-www-form-urlencoded
, такие как HTML-форма. Таким образом, вы должны просто использовать response.POST["field1"]
, как вы предполагали.
Если 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
в более новых версиях.
Из 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']
)