def index(self, request):
      if request.path == '/healthCheckhealthCheck' or request.method == 'OPTIONS':
         return Response(text='200',
                         headers=MultiDict(
                            {
                               # 'Content-Type': accept,
                               'Access-Control-Allow-Origin': '*',
                               'Access-Control-Allow-Headers': 'Origin, X-Requested-With, Content-Type, Cookie, Accept,X-PINGOTHER',
                               'Access-Control-Allow-Methods': 'GET,POST,PUT,DELETE,OPTIOS',
                               'Access-Control-Max-Age': '3600',
                               'Access-Control-Allow-Credentials': 'true'
                            },
                         )
                         )

      result = '{}'
      contentType = request.headers.get('CONTENT-TYPE', 'application/json')

      # pre-flight 요청을 회피하기 위해 json을 text로 받아서 처리한다.
      if contentType == 'text/plain':
         contentType = 'application/json'

      accept = request.headers.get('ACCEPT', 'application/json')
      encoding = request.headers.get('ACCEPT-ENCODING')
      referer = request.headers.get('Referer', '')

      # contentType이 xml이 아니면 json으로 처리
      if contentType != 'application/xml':
         contentType = 'application/json'

      # accept가 xml이 아니면 json으로 처리
      if accept != 'application/xml':
         accept = 'application/json'

      # contentType = 'application/xml'
      # accept = 'application/xml'

      requestDict = {}
      controllerResult = {}

      try:
         body = yield from request.text()
         if body:
            if contentType == 'application/xml':
               body = xmltodict.parse(body)  # convert to OrderedDict
               body = ujson.dumps(body)  # convert to json

            requestDict = {}

            try:
               requestDict = ujson.loads(body)  # json to dict
            except:
               post = yield from request.post()
               requestDict = dict(post)

            # print("post:", post)
            # if len(post) > 0:
            #  requestDict = dict(post)
            # else:
            #  requestDict = ujson.loads(body)         # json to dict
            # print("requestDict:", requestDict)

            if contentType == 'application/xml':
               for key, value in requestDict.items():
                  requestDict = value
                  break

         requestDict['service'] = request.path[1:].replace('/', '.')

         if not requestDict.get('method'):
            # http에서 POST, PUT, DELETE 구분하여 requestDict에 추가
            if request.method == 'POST':
               requestDict['method'] = 'create'
            elif request.method == 'PUT':
               requestDict['method'] = 'update'
            elif request.method == 'DELETE':
               requestDict['method'] = 'delete'
            elif request.method == 'GET':
               requestDict['method'] = 'read'

         controllerClass = controller.ControllerClass()
         controllerResult = yield from controllerClass.execute(requestDict, self.daoClass.connection, self.httpClass.connection)

         if accept == 'application/xml':
            result = dicttoxml.dicttoxml(controllerResult).decode('utf-8')  # dic to xml
         else:
            if controllerResult.get('service') == 'tools.exportToExcel':
               result = controllerResult
            else:
               result = ujson.dumps(controllerResult)  # dict to json
      except:
         print(traceback.format_exc())

         if accept == 'application/xml':
            result = '<root />'



      if controllerResult.get('service') == 'tools.exportToExcel':
         fileName = result.get('condition').get('fileName')
         response = Response(body=result.get('result'),
                        headers=MultiDict(
                           {
                                        'Pragma' : 'public',
                                        'Expires': '0',
                                        'Cache-Control': 'must-revalidate, post-check=0, pre-check=0',
                                 'Cache-Control': 'private',  # required for certain browsers,
                              'Content-Type': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;',
                              'Content-Disposition': 'attachment; filename=%s' % fileName,
                              'Content-Transfer-Encoding': 'binary',
                              'Access-Control-Allow-Origin': '*',
                              'Access-Control-Allow-Headers': 'Origin, X-Requested-With, Content-Type, Cookie, Accept,X-PINGOTHER',
                              'Access-Control-Allow-Methods': 'GET,POST,PUT,DELETE,OPTIONS',
                           },
                        )
                        )
      elif controllerResult.get('service') == 'tools.virtualBankNotificationReceive':
         result = None
         isSucceed = controllerResult.get('result').get('isSucceed')

         if isSucceed == True:
            result = "OK"
         else:
            result = "FAIL"
         response = Response(text=result,
                        headers=MultiDict(
                           {
                              'Content-Type': 'text/plain',
                              'Access-Control-Allow-Origin': '*',
                              'Access-Control-Allow-Headers': 'Origin, X-Requested-With, Content-Type, Cookie, Accept,X-PINGOTHER',
                              'Access-Control-Allow-Methods': 'GET,POST,PUT,DELETE,OPTIONS',
                              'Access-Control-Max-Age': '3600',
                              'Access-Control-Allow-Credentials': 'true'
                           },
                        )
                     )

      else:
         response = Response(text=result,
                        headers=MultiDict(
                           {
                              'Content-Type': accept,
                              'Access-Control-Allow-Origin': '*',
                              'Access-Control-Allow-Headers': 'Origin, X-Requested-With, Content-Type, Cookie, Accept,X-PINGOTHER',
                              'Access-Control-Allow-Methods': 'GET,POST,PUT,DELETE,OPTIONS',
                              'Access-Control-Max-Age': '3600',
                              'Access-Control-Allow-Credentials': 'true'
                           },
                        )
                        )

      response._keep_alive = True

      return response