在django documentation中,它说:
HttpRequest.POST
包含所有给定HTTP POST参数的类字典对象,前提是请求包含表单数据。请参阅下面的QueryDict文档。如果您需要访问请求中发布的原始或非表单数据,请通过HttpRequest.body属性访问它。
但是,服务器不响应浏览器(例如使用JS框架或表单),而是响应Anroid / iOS应用程序发送的REST API。
如果客户端直接在POST请求中发送字段,我该如何读取数据?例如,这(Java + Unirest):
Unirest.post("/path/to/server")
.field("field1", "value2")
.field("field2", "value2");
编辑:我可以使用response.POST["field1"]
简单地阅读数据,还是必须对request.body
执行某些操作?
编辑2:所以我可以简单地使用request.body
作为类似字典的对象,类似于request.POST
?
答案 0 :(得分:8)
据我所知,Unirest的字段方法只使用普通的application/x-www-form-urlencoded
数据,如HTML表单。所以你应该像你建议的那样使用response.POST["field1"]
。
答案 1 :(得分:5)
如果你正在与之交互的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
较新的版本。
答案 2 :(得分:4)
来自docs:
request.data
返回请求正文的已解析内容。这是 与标准request.POST
和request.FILES
属性类似 除了:
- 它包括所有已解析的内容,包括文件和非文件输入。
- 它支持解析
POST
以外的HTTP方法的内容,这意味着您可以访问PUT
和PATCH
的内容。 要求。- 它支持REST框架的灵活请求解析,而不仅仅是支持表单数据。例如,您可以处理传入
JSON
数据与处理传入表单数据的方式相同。
我可以使用
response.POST["field1"]
简单地阅读数据,还是我 必须对request.body
做些什么?所以我可以简单地使用
request.body
作为类似字典的对象 到request.POST
?
示例 - 来自create
方法(视图集):
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']
)