python类库31[httplib2处理http的get和post]

 

一 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

 

完!

posted @ 2011-01-10 16:56  iTech  阅读(14175)  评论(0编辑  收藏  举报