关于form表单或者Ajax向后台发送数据时,数据格式的探究
最近在做一个资产管理系统项目,其中有一个部分是客户端向服务端发送采集到的数据的,服务端是Django写的,客户端需要用rrequests模块模拟发送请求
假设发送的数据是这样的:
data = {'status' : True , 'content' : { 'k1' : 'xxxx' , 'k2' : 'xxxx' }}
是字典套字典的,然后通过requests.post(url = url ,data = data) 发送,会发现在服务端接收到的数据是这样的,<QueryDict>:{ [ 'status' , 'content' ] }
发生了什么,为什么只取到了key,但是没有取到values呢,既然能取到key,说明Django是没问题的
那问题肯定就出在requests.post发送数据上了
好了,铺垫完毕
想一下,ajax是怎么发送数据的
$.ajax ({
url : 'xxxx',
data : {
k1 : 1,
k2 : 'abc',
k3 : [1,2,3,4,'s']
}
})
呐,只能发送这三种格式吧,没有字典吧,如果非要发送字典,可以通过JSON把字典转成字符串格式,JSON.stringfy({ 'k1':'xxx' })
form 表单也是这样的,而requests.post就是仿造的form表单提交
发现了问题,我们再来剖析一下http发送post请求的过程
ajax发送的data是个字典,是键值对的形式,在http的post请求过程中,把这种键值对转换成
k1=xxx&k2=xxx这种格式,并且会带上一个请求头:
content-type : application/x-www-form-urlencoded
这个请求头和k1=xxx&k2=xxx这种格式是以一一对应的,只要发送这个格式,就必须带上这个请求头,后台的request.POST会根据这个请求头解析这种格式,还原成以前字典的格式。而且这种格式和这个请求头都是默认的,所以如果我们不修改,直接发送文章开始说的那种格式,服务端就不能解析,所以只拿到字典的key,没拿到value
但如果是现在这种情况,我们发送的不是这个格式,而是想要发送JSON.stringfy({ 'k1':'xxx' })这种json字符串,也是有办法的,ajax可以自定义请求头,改成这样:
$.ajax ({
url : 'xxxx',
headers : { 'content-type' : 'application/json' },
data : JSON.stringfy( {k1 : 1,k2 : 'abc',k3 : [1,2,3,4,'s']})
})
这样后台就会根据json去解析接收到的数据(json格式的字符串)
但是不能用request.POST了,因为request.POST 默认是按k1=xxx&k2=xxx这种格式解析数据的,
应该用request.body去拿数据,再用json.loads一下就拿到这个字典了
默认情况下,form 表单,ajax 以及 requests.post 都是这样处理的
所以在这个项目中,我们需要用requests自定义这个请求头,这个写法就很简单了
requests.post(url = url ,json = data) ,就行了,把原来的data关键字参数换成json关键字参数。
内部做的就是,1.序列化data,2.带一个请求头'content-type' : 'application/json'
这样,服务端拿到的数据,先decode解码一下,在json.loads,就是我们熟悉的字典了
关于form表单或者Ajax向后台发送数据时,数据格式的探究的更多相关文章
- iframe和form表单实现ajax请求上传数据
form的target属性设置为iframe的name值时,表示提交到url后返回的数据显示到iframe区域 <form action="/upload.html" met ...
- form表单的ajax验证2
form表单的ajax验证2: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"&g ...
- laravel中form表单,ajax传值没反应
laravel中form表单,ajax传值没反应时,可能是令牌有问题. form中添加: {{csrf_token()}} ajax中添加: data: {'page': page, '_token' ...
- Django框架 之 Form表单和Ajax上传文件
Django框架 之 Form表单和Ajax上传文件 浏览目录 Form表单上传文件 Ajax上传文件 伪造Ajax上传文件 Form表单上传文件 html 1 2 3 4 5 6 7 <h3& ...
- jQuery实现form表单基于ajax无刷新提交方法详解
本文实例讲述了jQuery实现form表单基于ajax无刷新提交方法.分享给大家供大家参考,具体如下: 首先,新建Login.html页面: <!DOCTYPE html PUBLIC &quo ...
- jquery序列化from表单使用ajax提交返回json数据(使用struts2注解result type = json)
1.action类引入struts2的"json-default"拦截器栈 @ParentPackage("json-default") //示例 @Paren ...
- jquery序列化form表单使用ajax提交后处理返回的json数据
1.返回json字符串: /** 将一个字符串输出到浏览器 */ protected void writeJson(String json) { PrintWriter pw = null; try ...
- jQuery动态创建form表单并提交到后台(携带一定的数据进行页面跳转)
今天遇到这么一个需求,携带一个编号一个名字跳转到另一个JSP页面,直接页面跳转(get携带数据)的话不太安全,于是想到到后台转发一下. 第一种:直接以表单提交方式的进行 JS代码: var form ...
- 如何把整张表格的数据通过form表单的方式传回后台
开发背景: 前段时间遇到这么一个需求,就是把一整张表格的数据存储在数据库中,之后再渲染在页面中,还可以进行重新编辑. 例如下边的课程表(为了方便,所以都是软件工程). 我也是经过一段时间的思考,才实现 ...
随机推荐
- java面向对象(四)之重写、重载
重载 定义 重载:在一个类中,存在多个方法拥有相同的名字,但在名字相同的同时,必须有不同的参数,这就是重载. 编译器会根据实际情况挑选出正确的方法,如果编译器找不到匹配的参数或者找出多个可能的匹配就会 ...
- Python自学日志_2017/9/05
9月5日今天早晨学习了网易云课程<Python做Web工程师课程>提前预习课程<学会开发静态网页>.轻松的完成了第五节课的两个实战作业--感觉自己这几天的功夫没有白费,总算学会 ...
- UEditor Flash文件上传-crossdomain.xml文件配置
在使用UEditor富文本时,如果客户端的浏览器是低版本浏览器,如IE7.IE8等,UEditor的文件上传方式将会使用flash方式上传而不是html5,而flash在跨域时唯一的限制策略就是cro ...
- css:box-sizing什么作用
css3 box-sizing属性 box-sizing属性可以为三个值之一:content-box(default),border-box,padding-box. content-box,bord ...
- 团队作业2--需求分析&原型设计
一.需求分析 1.用户采访 a.采访对象: 分别对本学院同学.其他专业同学.部分老师等总计15人进行了采访调研: b.采访截图: c.采访总结: (1).功能需求 能够将所提供的四个数进 ...
- 201521123085《Java程序设计》第4周学习总结
1.本周学习总结 1.1 尝试使用思维导图总结有关继承的知识点. 2.书面作业 Q1.注释的应用 使用类的注释与方法的注释为前面编写的类与方法进行注释,并在Eclipse中查看.(截图) Q2.面向对 ...
- 201521123001《Java程序设计》第3周学习总结
1. 本周学习总结 2. 书面作业 1. 代码阅读 public class Test1 { private int i = 1;//这行不能修改 private static int j = 2; ...
- 201521123079《java程序设计》第9周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 本次PTA作业题集异常 1.常用异常 题目5-1 1.1 截图你的提交结果(出现学号) 1.2 自己 ...
- 03标准对象-02-RegExp 正则表达式
1.基本概念 和 定义 用一种描述性的语言来给字符串定义一个规则,你可以形象地理解正则表达式是一个"框",凡是符合大小形状条件的字符串,都算是"匹配"了. JS ...
- Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/***]]
问题描述:Tomcat容器和Eclipse启动运行时候报错 Failed to start component [StandardEngine[Catalina].StandardHost[local ...