HTTP请求中的content-type

网页开发分前端和后端是非常好的事情,大家设计好统一的接口,用JSON进行数据传输,前端后端就可以各自开发了。

然而,前端开发好了,后端也开发好了,合起来之后,大概最容易出现的事情就是:

前端传过来的数据在哪里啊!GET不到啊!POST也找不到啊!

你这个0怎么是字符串啊,不是说好了是整数吗???

你这个false是字符串???我真是***

。。。。。。

今天遇到了一个这样的问题,在这里记录一下。

主要的问题就是http请求中的 Content-Type 

这里只分析两种情况: application/json & application/x-www-form-urlencoded , 至于 multi-part/form-data ,这里不做讨论。

任务: 前端通过url发送json对象obj给后端

Content-Type : application/json

这个设置相当于把JSON.stringfy(obj)作为request的body发送出去。所以,后端只要对request.body进行json解析即可。比如,在python中,json.loads(request.body)即可得到原原本本的json, 类型也是正确的,前端送来的JS false会转成python的False。

Content-Type : application/x-www-form-urlencoded

这个设置就比较迷,把JSON对象直接以类似于编码进url的形式传送(并不一定真的会出现在url中)。以url方式传送的一个“特点”就是:字符串和整数是不分的!(或者说不存在整数/布尔值,只存在"0" / "false").

仔细看这个类型的名字,可以看到,这个类型是为了表单数据设计的,而表单中,一般都是字符串,如账号密码。所以这样子不要紧吧。

解决方法(以django为例):

前端是GET: request.GET得到数据。(得不到int/bool的,放弃吧)

前端是POST,Content-Type 为 application/json : data = json.loads(request.body) 。完美获取数据。

前端是POST,Content-Type :为application/x-www-form-urlencoded : request.POST得到数据。(得不到int/bool的,放弃吧)

另外说一点,HTML的表单元素form, 默认的Content-Type 为application/x-www-form-urlencoded


开发愉快 +~_+~

你可能感兴趣的:(HTTP请求中的content-type)