在django文档中,它说:
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
?
据我所知,Unirest的字段方法只使用普通application/x-www-form-urlencoded
数据,如HTML表单.所以你应该能够response.POST["field1"]
像你建议的那样使用.
从文档:
request.data
返回请求正文的解析内容。这类似于标准request.POST
和request.FILES
属性,除了:
它包括所有已解析的内容,包括文件和非文件输入。
它支持解析除以外的HTTP方法的内容
POST
,这意味着您可以访问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'] )
如果你正在与之交互的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')
注意:如果你发现request.DATA
在互联网上的某个地方使用也是正确的,但它只对旧版本的DRF有效,并且request.data
在新版本中不赞成使用它.