需求:客戶需要通過HTTP請求(URL)方式訪問子系統,用於請求XXX數據,返回XML數據格式。
方案:使用一個python腳本來起一個socket服務,用於客戶來訪問該服務獲取數據。
代碼如下:
以下代碼處理兩個不同的客戶訪問我們服務,上下文分別為/doTrader 一個返回json字符串 /wjdInterface 一個返回XML報文
def doTrader(paramXml, httpUrl):
xxxxxx
return json.dumps(results)
def wjdInterface(paramXml, httpUrl):
xxxxx
res_xml = makeXmlForHandle(results)
return res_xml
# 將對象編輯成XML報文格式
def makeXmlForHandle(dic):
xml = "<FUND_RECORD>\n"
print(dic)
if dic != None:
for item in dic:
xml += "<" + item + ">" + str(dic[item]) + "</" + item + ">\n"
else:
xml += "<rescode>0</rescode>\n<resmsg>未找到相關數據</resmsg>\n"
xml += "</FUND_RECORD>"
return xml
----------------------------------------------------------------------------------------------------------------------------
from flask import Flask
from flask_spyne import Spyne
from spyne.model.primitive import Unicode, Integer
from spyne.model.complex import Iterable
from spyne import Application as TraderService
from spyne import rpc
from spyne import ServiceBase
from spyne import Iterable, Integer, Unicode, String
from spyne.protocol.soap import Soap11
from spyne.server.wsgi import WsgiApplication
from dateutil.relativedelta import relativedelta
from HBase import HBase
import sys
from hbase.ttypes import ColumnDescriptor, Mutation, BatchMutation
from ELSearch import ELSearch
import logging
import datetime
import urllib
import urllib2
import json
import time
import select
import os
import sys
import socket
import threading # install
socketHost="0.0.0.0"
sport = sys.argv[1]
iport = int(sport)
socketPort =iport
today = datetime.datetime.today()
# logging.basicConfig()
# reload(sys)
# sys.setdefaultencoding('utf-8')
# count = 0
elHost = "127.0.0.1"
elPort = 9200
# # 業務系統接口
interfaceURL = "http://127.0.0.1:9010/gjj/intservice"
elSearch = ELSearch(elHost, elPort)
#設置默認編碼 用於解決URL方法獲取結果后轉為中間編碼超長(128)問題
defaultencoding = 'utf-8'
if sys.getdefaultencoding() != defaultencoding:
reload(sys)
sys.setdefaultencoding(defaultencoding)
def process(event):
try:
event.setblocking(0)
data = event.recv(buffLen)
if data:
arr = data.split("\r\n")
#post提交的參數
json1 = arr[len(arr) - 1]
postUrl = ""
rsp = "" # 相應報文
context, url, urlGetParams = getContextAndParams(arr[0])
if (len(arr) > 0):
if context == "doTrader":
rsp = doTrader(json1, url)
# rsp = doTrader(json1, postUrl.split()[1])
# rsp = "{中國}"
resp = 'HTTP/1.1 200 OK\r\n'
resp += 'Server:RsServer\r\n'
resp += 'Content-Type: application/json;charset=utf-8\r\n'
resp += 'Connection: close\r\n'
resp += 'Cache-Control: no-cache\r\n'
resp += 'pragma: no-cache\r\n'
resp += 'Content-Length: ' + str(len(rsp)) + '\r\n\r\n'
resp += rsp
event.send(resp)
else:
rsp = wjdInterface(urlGetParams, url)
# rsp = doTrader(json1, postUrl.split()[1])
# rsp = "{中國}"
resp = 'HTTP/1.1 200 OK\r\n'
resp += 'Server:RsServer\r\n'
resp += 'Content-Type: text/xml;charset=utf-8\r\n'
resp += 'Connection: close\r\n'
resp += 'Cache-Control: no-cache\r\n'
resp += 'pragma: no-cache\r\n'
resp += 'Content-Length: ' + str(len(rsp)) + '\r\n\r\n'
resp += rsp
event.send(resp)
except Exception, e:
print(e)
event.close()
server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server.setblocking(0)
server.bind((socketHost,socketPort))
server.listen(1024)
print("Bind "+socketHost+":"+str(socketPort)+" ok!")
inputs=[server,]
buffLen=25600
while True:
r_list,w_list,e_list=select.select(inputs,[],[],1)
for event in r_list:
if event==server:
ss,addr=event.accept()
inputs.append(ss)
else:
thread = threading.Thread(target=process, args=(event,))
thread.start()
inputs.remove(event)
---------------------------------------------------------------------------
啟動腳本 restart.sh
單線程腳本內容
pkill -9 -f ys.py
nohup python -u ys.py 6030 &
------------------------------------------------------------------------------------------------------------------------
通過POSTMAN發送http請求
A客戶:
B客戶: