1、关于HTTP的GET方法的长度限制:
背景:昨天工作中遇到了个问题,很简单,一个GET请求因为QueryParam中有一个超长的json(大概1w字符),chrome中发送失败,于是了解了下GET方法的长度限制,在此记一笔~
HTTP的GET方法没有长度限制,但是不同的浏览器和服务器都有自己的限制:
IE6.0:url最大长度2083个字符,超过最大长度后无法提交。
IE7.0:url最大长度2083个字符,超过最大长度后仍然能提交,但是只能传过去2083个字符。
firefox 3.0.3 :url最大长度7764个字符,超过最大长度后无法提交。
Opera 9.52:url最大长度7648个字符,超过最大长度后无法提交。
Google Chrome 2.0.168 :url最大长度7713个字符,超过最大长度后无法提交
PS:上述数据是从别处copy来的,准确与即时与否暂不讨论,只是用来说明问题,即每个浏览器长度限制不同,超长后的处理也不尽相同,因此url有可能超长的时候,改用POST方法吧~
2、HTTP方法的编码:
[{:,空格等标点会被编码成ASCII码,非英文字符使用base64编码,总之就是编码之后不可读。相关方法可以用encodeURI、decodeURI、encodeURIComponent、decodeURIComponent自行解决,相应的后端也要URLDecoder进行编/解码。
还是昨天写代码的时候,之前使用params: encodeURIComponent(Ext.JSON.encode(queryParams))这种方法在url中传的参数,从GET方法改为POST方法后,后端解不出来了(后端未做修改),前端改为params: Ext.JSON.encode(queryParams)就好了,不晓得什么原因……
可能原因猜想:
EXT.JS自己做了编码;
HTTP中GET方法和POST方法对编码的要求不同
encodeURIComponent的问题
Ext.JSON.encode动了手脚
先从第三点开始吧(因为懒得查第一点……)
3、encodeURI 和 encodeURIComponent
————————————————学者范儿分割线————————————————————
两者都是ECMA-262标准中定义的函数,所有兼容这个标准的语言(如JavaScript, ActionScript)都会实现这两个函数。
它们都是用来对URI (RFC-2396)字符串进行编码的全局函数,但是它们的处理方式和使用场景有所不同。为了解释它们的不同,我们首先需要理解RFC-2396中对于URI中的字符分类:
保留字符(reserved characters):这类字符是URI中的保留关键字符,它们用于分割URI中的各个部分。这些字符是:";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | ","
Mark字符(mark characters):这类字符在RFC-2396中特别定义,但是没有特别说明用途,可能是和别的RFC标准相关。 这些字符是:"-" | "_" | "." | "!" | "~" | "*" | "'" | "(" | ")"
基本字符(alphanum characters):这类字符是URI中的主体部分,它包括所有的大写字母、小写字母和数字
在介绍完上面三类字符串后,我们就非常容易来解释encodeURI和encodeURIComponent函数的不同之处了:
encodeURI: 该函数对传入字符串中的所有非(基本字符、Mark字符和保留字符)进行转义编码(escaping)。所有的需要转义的字符都按照UTF-8编码转化成为一个、两个或者三个字节的十六进制转义字符(%xx)。例如,字符空格" "转换成为"%20"。在这种编码模式下面,需要编码的ASCII字符用一个字节转义字符代替,在\u0080和\u007ff之间的字符用两个字节转义字符代替,其他16为Unicode字符用三个字节转义字符代替 encodeURIComponent: 该函数处理方式和encodeURI只有一个不同点,那就是对于保留字符同样做转义编码。例如,字符":"被转义字符"%3A"代替
之所以有上面两个不同的函数,是因为我们在写JS代码的时候对URI进行两种不同的编码处理需求。
差别:
encodeURI可以用来对完整的URI字符串进行编码处理。
encodeURIComponent可以对URI中一个部分进行编码,从而让这一部分可以包含一些URI保留字符。
encodeURIComponent例子:
http://www.mysite.com/send-to-friend.aspx?url=http://www.mysite.com/product.html
能且仅能使用encodeURIComponent编码,否则这将是一个无效URL(包含URL保留字)
正确的URI应该如下:
http://www.mysite.com/send-to-friend.aspx?url=http%3A%2F%2Fwww.mysite.com%2Fproduct.html
encodeURI例子:
谁来补充下?!
————————————————学者范儿分割线————————————————————
4、HTTP中GET方法和POST方法编码:
通过第三点知道GET方法中QueryParam如果有需要编码的字符需要使用encodeURIComponent进行编码,那么POST方法中的FormParam需要编码吗?
TO BE CONTINUED……