起因
小x说他使用之前的传输方式传输较大的数据量时,后台报错了。
之前的形式是:
cspServices.factory('a',function($http) {
var service = {};
service.test=function(param,callback){
$http({
url:'/a/test',
params: param,
method: 'POST'
}).success(function(res){
callback(res);
}).error(function(res) {
var pro = {};
pro.result=false;
pro.reason='失败';
callback(pro);
});
}
})
注意其中$http的内容。那时候对angular一点都不了解,为了业务需求,写了这个。后来将所有需要传输的数据都放在param中。比如,要传输{ a:1, b:2}。则在调用的时候,用
a.test({a:1, b:2},function(callback){
})
angularjs 中的$http的基本用法:
$http({
method: 'GET',
url: '/someUrl'
}).then(function successCallback(response) {
// this callback will be called asynchronously
// when the response is available
}, function errorCallback(response) {
// called asynchronously if an error occurs
// or server returns response with an error status.
});
method中我们常用以get 与 post为例。当method为get时,可以写如下参数:
$http({
method: 'GET',
url: '/someUrl',
params: params,
headers:{
'Content-Type':....
}).then(function successCallback(response) {
}, function errorCallback(response) {
});
其中,params是需要传递的数据对象。在后台时,拿到params数据的方法就是req.query;
当method是POST/PUT/PATCH/DELETE时,需要写成:
$http({
method: 'POST',
url: '/someUrl',
data: {},
headers:{
'Content-Type':....
}).then(function successCallback(response) {
}, function errorCallback(response) {
});
在后台拿到数据的方法就是req.body.
注意:get与post大小限制
get
Http Get方法提交的数据大小长度并没有限制,HTTP协议规范没有对URL长度进行限制。这个限制是特定的浏览器及服务器对它的限制.
如:IE对URL长度的限制是2083字节(2K+35)。
post
理论上讲,POST是没有大小限制的。HTTP协议规范也没有进行大小限制,起限制作用的是服务器的处理程序的处理能力。
如:在Tomcat下取消POST大小的限制(Tomcat默认2M);
打开tomcat目录下的conf目录,打开server.xml 文件,修改
debug="0"
acceptCount="100"
connectionTimeout="20000"
disableUploadTimeout="true"
port="8080"
redirectPort="8443"
enableLookups="false"
minSpareThreads="25"
maxSpareThreads="75"
maxThreads="150"
**maxPostSize="0"**
URIEncoding="GBK
个人理解:
1. 多数浏览器对于POST采用两阶段发送数据的,先发送请求头,再发送请求体,即使参数再少再短,也会被分成两个步骤来发送(相对于GET),也就是第一步发送header数据,第二步再发送body部分。因此POST可以传输的量更大一些,但也更耗时一些。GET只需要一次传输,相对来说,则更安全可靠,且网络耗时更短。
2. GET请求可以被浏览器cache, 因此最好不要提交敏感数据,否则在历史浏览记录中容易被泄露。而POST则不会被cache;
3. GET参数是放在url后面的,不同的浏览器对url长度有限制。POST理论上没有(因为放在body里面);
4. GET提交的数据大小,不同浏览器有不同大小限制。POST提交数据大小由服务器设定。POST可传输数据比GET大的多;
5. 全部用POST肯定不合理。数据相对不敏感/请求频繁且较小的情况下,用GET。