一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

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

 

热门栏目