Web APIに柔軟に対応するために
MetaGatewayは,
さらにこれらのサービスだけでなく,
MetaGatewayでは新しいサービス等が増えても,
たとえば,
実際はファイルを置いただけで機能を追加できるようにでもできますが,
リスト1
SERVICE_SUPPORTS = [
{
'key':'twitter',
'api':API_TYPE_TWITTER,
'auth':AUTH_TYPE_BASIC,
'type':SERVICE_TYPE_NO_REQUIRE,
},
{
'key':'hatena_haiku',
'api':API_TYPE_HATENA_HAIKU,
'auth':AUTH_TYPE_BASIC,
'type':SERVICE_TYPE_NO_REQUIRE,
},
...
]
MetaGatewayのプラグイン実装
まずはMetaGatewayのコードを実際に出しながら,
まず,
リスト2
class ApiPlugin():
DEFAULT_CHANNEL_ID = '1'
def __init__(self, end_point, auth):
self.end_point = end_point
self.auth = auth
self.error_msg = None
def isAuthed(self):
return False
def getUserInfo(self, params):
return False
def getUserChannels(self, params):
return False
def getPost(self, params):
assert( params.has_key('post_id') )
post_id = params[ 'post_id']
documents = self.getRecentPosts(params)
for document in documents:
if( document['post_id'] == post_id ):
return document
raise ApplicationException()
def getRecentPosts(self, params):
return []
def createPost(self, params):
raise ApplicationException()
def isCreatePost(self):
return True
def deletePost(self, params):
raise ApplicationException()
def editPost(self, params):
raise ApplicationException()
def createUploadFile(self, params):
raise ApplicationException()
def getUploadFiles(self, params):
raise ApplicationException()
def deleteUploadFile(self, params):
raise ApplicationException()
def getCategories(self, params):
return []
def getPostCategories(self, params):
return []
def setPostCategories(self, params):
return True
def getTrackbackPings(self, params):
return []
def canTrackback(self, params={}):
return False
def rebuildSite(self, params):
return True
def formatTitle(self, title = ''):
return title
def formatBody(self, body = ''):
return body
boundary = None
def makeBoundary(self):
if( self.boundary == None ):
self.boundary = '----------------------------' + str(int(time.time()))
return self.boundary
MULTIPART_CONTENT_TYPE = 'multipart/form-data'
def makeMultipartHeader(self):
content_type = ("%s; boundary=%s" % (self.MULTIPART_CONTENT_TYPE, self.makeBoundary()))
return {'Content-Type':content_type}
def makeMultipartBody(self, params, exinfo={}):
boundary = self.makeBoundary()
orderd = sorted(params.keys())
s = ''
for k in orderd:
s += ( '--' + boundary + "\r\n" )
if( exinfo.has_key(k) ):
s += ('Content-Disposition: form-data; name=\"%s\"; filename="%s"\r\n' % (k, exinfo[k]['filename']) )
s += ('Content-Type: %s' % (exinfo[k]['content-type']) + "\r\n")
s += ('Content-Length: %s' % len(params[k]) + "\r\n\r\n")
else:
s += ('Content-Disposition: form-data; name=\"%s\"\r\n\r\n' % (k) )
s += (params[k] + "\r\n")
s += ( '--' + boundary + '--\r\n\r\n' )
return s
リスト2のコードは,
isAuthedは,
isCreatePostは,
rebuildSiteは,