该代码参考新浪python api,适用于各个开源api请求
代码如下:
# -*- coding: utf-8 -*-
import collections
import gzip
import urllib
import urllib2
from urlparse import urlparse
try:
from cStringIO import StringIO
except ImportError:
from StringIO import StringIO
try:
import json
except ImportError:
import simplejson as json
__author__ = 'myth'
_HTTP_GET = 1
_HTTP_POST = 2
# 超时时间(秒)
TIMEOUT = 45
RETURN_TYPE = {"json": 0, "xml": 1, "html": 2, "text": 3}
_METHOD_MAP = {'GET': _HTTP_GET, 'POST': _HTTP_POST}
class APIError(StandardError):
"""
raise APIError if receiving json message indicating failure.
"""
def __init__(self, error_code, error, request):
self.error_code = error_code
self.error = error
self.request = request
StandardError.__init__(self, error)
def __str__(self):
return 'APIError: %s: %s, request: %s' % (self.error_code, self.error, self.request)
# def callback_type(return_type='json'):
#
# default_type = "json"
# default_value = RETURN_TYPE.get(default_type)
# if return_type:
# if isinstance(return_type, (str, unicode)):
# default_value = RETURN_TYPE.get(return_type.lower(), default_value)
# return default_value
def _format_params(_pk=None, encode=None, **kw):
"""
:param kw:
:type kw:
:param encode:
:type encode:
:return:
:rtype:
"""
__pk = '%s[%%s]' % _pk if _pk else '%s'
encode = encode if encode else urllib.quote
for k, v in kw.iteritems():
_k = __pk % k
if isinstance(v, basestring):
qv = v.encode('utf-8') if isinstance(v, unicode) else v
_v = encode(qv)
yield _k, _v
elif isinstance(v, collections.Iterable):
if isinstance(v, dict):
for _ck, _cv in _format_params(_pk=_k, encode=encode, **v):
新闻热点
疑难解答