最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
http的get和post
时间:2011-01-10 编辑:简简单单 来源:一聚教程网
一 http的get和post
get和post的区别:get是从服务器上获取数据,post是向服务器传送数据。
(1)参数传输方式,
get提交,请求的数据会附在url之后,以?分割url和传输数据,多个参数用&连接;例 如:login.action?name=hyddd&password=idontknow&verify=%e4%bd%a0 %e5%a5%bd。如果数据是英文字母/数字,原样发送,如果是空格,转换为+,如果是中文/其他字符,则直接把字符串用base64加密,得出如: %e4%bd%a0%e5%a5%bd,其中%xx中的xx为该符号以16进制表示的ascii。
post提交:把提交的数据放置在是http包的包体中。因此,get提交的数据会在地址栏中显示出来,而post提交,地址栏不会改变。
(2)传输数据的大小,
首先声明http协议没有对传输的数据大小进行限制,http协议规范也没有对url长度进行限制。而在实际开发中存在的限制主要有:
get:特定浏览器和服务器对url长度有限制,例如 ie对url长度的限制是2083字节(2k+35)。对于其他浏览器,如netscape、firefox等,理论上没有长度限制,其限制取决于操作系统的支持。因此对于get提交时,传输数据就会受到url长度的限制。
post:由于不是通过url传值,理论上数据不受限。但实际各个web服务器会规定对post提交数据大小进行限制,apache、iis6都有各自的配置。
(3)安全性:
post的安全性要比get的安全性高。这里安全的含义是真正的security的含义,比如:通过get提交数据,用户名和密码将明文出现在url上,因为(1)登录页面有可能被浏览器缓存, (2)其他人查看浏览器的历史纪录,那么别人就可以拿到你的账号和密码了,除此之外,使用get提交数据还可能会造成cross-site request forgery攻击。
get和post的相同: get,post协议都是在http上运行的。
get:请求参数是作为一个key/value对的序列(查询字符串)附加到url上的查询字符串的长度受到web浏览器和web服务器的限制(如ie最多支持2048个字符),不适合传输大型数据集同时,它很不安全。
post:请求参数是在http标题的一个不同部分(名为entity body)传输的,这一部分用来传输表单信息,因此必须将content-type设置为:application/x-www-form- urlencoded。post设计用来支持web窗体上的用户字段,其参数也是作为key/value对传输。但是:它不支持复杂数据类型,因为post没有定义传输数据结构的语义和规则。
简单地讲,http web 服务是指以编程的方式直接使用 http 操作从远程服务器发送和接收数据。如果你要从服务器获取数据,使用http get;如果你要向服务器发送新数据,使用http post. 一些更高级的http web 服务 api也允许使用http put 和 http delete来创建、修改和删除数据。
二 web实例
实例来自:http://fy.webxml.com.cn/webservices/englishchinese.asmx?op=translatorstring ,用来实现中英文的翻译的免费的webservice,同时提供get+post+soap访问支持。
三 python的http web库
python 3 带有两个库用于和http web 服务交互:
•http.client 是http 协议的底层库.
•urllib.request 建立在http.client之上一个抽象层。它为访问http 和 ftp 服务器提供了一个标准的api,可以自动跟随http 重定向, 并且处理了一些常见形式的http 认证。
•httplib2,一个第三方的开源库,它比http.client更完整的实现了http协议,同时比urllib.request提供了更好的抽象。
python的http库不支持缓存,而httplib2支持。
python的http 库不支持最后修改时间检查,而httplib2 支持。
python http库不支持etag,而httplib2支持.
python的 http库不支持压缩,但httplib2支持。
httplib2 帮你处理了永久重定向。它不仅会告诉你发生了永久重定向,而且它会在本地记录这些重定向,并且在发送请求前自动重写为重定向后的url。
httplib2的
下载:http://code.google.com/p/httplib2/
安装:python31 setup.py install
四 httplib2使用get和post实例
# -*- coding: utf-8 -*-
def testhttpget():
import httplib2
#httplib2.debuglevel = 1
word='中国'
urlstr = 'http://fy.webxml.com.cn/webservices/englishchinese.asmx/translatorstring' + '?wordkey=' + word
h = httplib2.http('.cache')
response,content = h.request(urlstr)
#for item in response.items(): print(item)
print(content.decode('utf-8'))
#print(content)
def testhttppost():
import httplib2
from urllib.parse import urlencode
#httplib2.debuglevel = 1
word='美国'
urlstr = 'http://fy.webxml.com.cn/webservices/englishchinese.asmx/translatorstring'
data={'wordkey':word}
h = httplib2.http('.cache')
response,content = h.request(urlstr, 'post', urlencode(data), headers={'content-type': 'application/x-www-form-urlencoded'})
#for item in response.items(): print(item)
print(content.decode('utf-8'))
#print(content)
testhttpget()
testhttppost()
结果如下:
当从英文到中文翻译后得到的结果xml貌似不是utf8的,总是有错误:
content.decode('utf-8')报错unicodeencodeerror: 'gbk' codec can't encode character 'u0283' in position 224: illegal multibyte sequence