Last active
September 19, 2021 21:48
-
-
Save leafsummer/9659861 to your computer and use it in GitHub Desktop.
My share snippets
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from restclient import GET, POST | |
import simplejson as json | |
import logging | |
import socket | |
logger = logging.getLogger('rs.utils.restclient') | |
class ConnectAPI(object): | |
''' | |
all the way of connection web and api server | |
''' | |
def __init__(self, host, port, user=None, passwd=None, method='get'): | |
self.host = host | |
self.port = port | |
self.user = user | |
self.passwd = passwd | |
self.method = method | |
self.timeout = 60 | |
self.data_params = {} | |
self.header = {} | |
client_ip = socket.gethostbyname(socket.gethostname()) | |
self.header['Client-IP'] = client_ip | |
def set_timeout(self, timeout): | |
if isinstance(timeout, (int, basestring)): | |
try: | |
timeout = int(timeout) | |
except ValueError, e: | |
logger.error("timeout set is error:%s, timeout:%s"%(e, timeout)) | |
timeout = None | |
if timeout is not None: | |
self.timeout = timeout | |
else: | |
logger.error("timeout set is error, timeout param type is invalid, must be int or base10 string") | |
def set_header(self, header): | |
if isinstance(header, dict): | |
self.header.update(header) | |
else: | |
logger.error("header set is error, header param type is invalid, must be dict type") | |
def set_method(self, method): | |
if method in ['get', 'post', 'put', 'delete']: | |
self.method = method | |
else: | |
logger.error("method set is error, method param type is invalid, must be rest request type") | |
def call_by_httplib(self, url, header={}, data_params={}, method=None, timeout=None): | |
logger.debug('call rest api from the server by httplib, url: %s'%url) | |
if header: | |
self.set_header(header) | |
if timeout: | |
self.set_timeout(timeout) | |
if method: | |
self.set_method(method) | |
if not isinstance(data_params, dict): | |
result = {'status': 'failure', 'content': {'error':'the data params must be dict type'}} | |
return result | |
url = "".join([":".join([self.host, self.port]), url]) | |
try: | |
socket.setdefaulttimeout(self.timeout) | |
if self.method == 'get': | |
json_data = GET(url, params=data_params, headers=self.header, accept=["application/json"], async=False) | |
elif self.method == 'post': | |
self.header['Content-Type'] = "application/json" | |
self.header['Content-Length'] = len(data_params) | |
self.header['Connection'] = "Keep-Alive" | |
if self.user and self.passwd: | |
credential = (self.user, self.passwd) | |
else: | |
credential = tuple() | |
json_data = POST(url, params=data_params, headers=self.header, accept= ["application/json"], | |
credentials=credential, async=False) | |
try: | |
dictinfos = json.loads(json_data) | |
if 'errorcode' in dictinfos: | |
status = 'failure' | |
elif 'result' in dictinfos and dictinfos['result'] != 3000: | |
status = 'failure' | |
else: | |
status = 'success' | |
result = {'status': status, 'content': dictinfos} | |
except ValueError, e: | |
logger.error("parse the json format is error: %s" %e) | |
result = {'status': 'failure', 'content': {'error':'parse the json format is error'}} | |
except Exception, e: | |
import traceback | |
traceback.print_exc() | |
# print 'can not call the rest api, connect the server error: %s' % e | |
logger.error('can not call the rest api, connect the server error: %s'%e) | |
result = {'status': 'failure', 'content': {'error':'can not call the rest api, connect the server error'}} | |
return result |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment