阶段性源码将于本章节末尾给出下载
新建web数据接口http-request解析类com.zxy.tcp.Request.py
#! python3
# -*- coding: utf-8 -
'''
Created on 2017年05月10日
@author: zxyong 13738196011
'''
import urllib.parse,json
from com.zxy.common import Com_Para
from com.zxy.common.Com_Fun import Com_Fun
from com.zxy.model.Return_Value import Return_Value
from com.zxy.z_debug import z_debug
#监测数据采集物联网应用--web数据接口http-request解析
class Request(z_debug):
attStrIP = ""
attServSocket = None
attUri = ""
attPost_str = []
attRv = Return_Value()
attUploadFile = ""
attConnection = ""
def __init__(self):
pass
def parseUri(self,inputValue):
temStrResult = ""
if inputValue.find("/favicon.ico") != -1:
temStrResult += "favicon.ico"
return temStrResult
elif inputValue.find(Com_Para.Inf_Name) != -1:
for temStrITem in inputValue.split("\r\n"):
if temStrITem.find(Com_Para.Inf_Name) != -1:
if (temStrITem.split(" ")[1]).find("?") != -1:
temStrResult += urllib.parse.unquote(temStrITem.split(" ")[1].split("?")[1])
else:
temStrResult += urllib.parse.unquote(temStrITem.split(" ")[1])
break
elif self.FindWebName(inputValue):
for temStrITem in inputValue.split("\r\n"):
if self.FindWebName(temStrITem):
temStrT = temStrITem.split(" ")[1]
if temStrT.find("?") == -1:
temStrResult = urllib.parse.unquote(temStrITem.split(" ")[1],Com_Para.U_CODE)
else:
temStrResult = urllib.parse.unquote(temStrT[0:temStrT.find("?")],Com_Para.U_CODE)
break
elif len(inputValue) > 10:
temStrResult = inputValue
return temStrResult
def FindWebName(self,inputValue):
for temAttF in Com_Para.web_Name:
if inputValue.find(temAttF) != -1:
return True
return False
def PostData(self,inputValue):
temStrResult = ["",""]
if self.FindWebName(inputValue):
temStrTem = inputValue.split("\r\n")
if len(temStrTem[0].split(" ")) > 1 and (temStrTem[0].split(" ")[0] == "POST" or temStrTem[0].split(" ")[0] == "OPTIONS") :
temContent_Length = -1
temStrEnd = inputValue[len(inputValue) - 4:len(inputValue)]
if temStrEnd != "\r\n\r\n":
temStrResult[1] = temStrTem[len(temStrTem) - 1]
for temStrItem in temStrTem:
temStrItem = urllib.parse.unquote(temStrItem,Com_Para.U_CODE)
if temStrItem.find("post_param: ") == 0:
temStrResult[1] = temStrItem[temStrItem.find("post_param: ") + 12:len(temStrItem)]
temStrResult[0] = "Content-Length:"
temStrResult[0] += str(len(temStrResult[1]))
break
if temStrItem.find("Content-Length:") == 0:
temContent_Length = int(temStrItem.split(":")[1].strip())
temStrResult[0] = "Content-Length:"
temStrResult[0] += str(temContent_Length)
if temContent_Length > 0 and temContent_Length == len(temStrResult[1].encode(Com_Para.U_CODE)):
break
return temStrResult
def GetHttpHeadByte(self,inputValue):
temResult = {}
for temStrItem in inputValue.split(b"\r\n"):
if temStrItem.find(b"POST") == 0 or temStrItem.find(b"GET") == 0:
strKey = temStrItem.split(b" ")[0]
strValue = temStrItem.split(b" ")[1]
else:
strKey = temStrItem[0:temStrItem.find(b":")]
strValue = temStrItem[len(strKey)+1:len(temStrItem)]
if Com_Fun.GetHashTableNone(temResult, strKey) == None:
Com_Fun.SetHashTable(temResult, strKey, strValue)
return temResult
def GetHttpHead(self,inputValue):
temResult = {}
for temStrITem in inputValue.split("\r\n"):
if temStrITem.find("POST") == 0 or temStrITem.find("GET") == 0:
strKey = temStrITem.split(" ")[0]
strValue = temStrITem.split(" ")[1]
else:
strKey = temStrITem[0:temStrITem.find(":")]
strValue = temStrITem[len(strKey)+1:len(temStrITem)]
if Com_Fun.GetHashTableNone(temResult, strKey) == None:
Com_Fun.SetHashTable(temResult, strKey, strValue)
return temResult
def GetHttpHeadArray(self,inputValue):
inputValue = inputValue[inputValue.find(b"\r\n\r\n")+4:len(inputValue)]
temResult = []
for temStrITem in inputValue.split(b"\n"):
temResult.append(temStrITem)
return temResult
#从套接字中读取字符信息
def parse(self):
temInit_msg = b'' # 初始化流
temFile = None
temValue = ""
try:
temInit_msg = self.attServSocket.recv(20480) #接受数据 20480
temStrCheck = []
#特殊符号处理
try:
temValue = temInit_msg.decode(Com_Para.U_CODE)
self.attUri = self.parseUri(temValue)
temStrCheck = self.PostData(temValue)
except Exception as et:
if temInit_msg.find(b"\r\n\r\n") == -1:
return
else:
temValue = temInit_msg[0:temInit_msg.find(b"\r\n\r\n")].decode(Com_Para.U_CODE)
self.attUri = self.parseUri(temValue)
temStrCheck = self.PostData(temValue)
inputHtHead = self.GetHttpHeadByte(temInit_msg)
self.attConnection = Com_Fun.GetHashTable(inputHtHead,b"Connection").decode(Com_Para.U_CODE)
#数据接口
if temStrCheck[0] != "" and int(temStrCheck[0].split(":")[1].strip()) == len(temStrCheck[1].encode(Com_Para.U_CODE)):
self.attPost_str = urllib.parse.unquote(temStrCheck[1].replace("+","%20"),Com_Para.U_CODE).split("&")
if temStrCheck[1] != "":
self.attUri += "&" + urllib.parse.unquote(temStrCheck[1].replace("+","%20"),Com_Para.U_CODE)
#附件上传
elif temStrCheck[0] != "" and int(temStrCheck[0].split(":")[1].strip()) > 0:
if self.attUri.find("param_name=upLoadFile") != -1:
bSaveFile = False
#附件大小
iAllLength = int(temStrCheck[0].split(":")[1].strip())
if Com_Fun.GetHashTable(inputHtHead,b"Content-Type").find(b"boundary=") == -1:
boundary = Com_Fun.Get_New_GUID().encode(Com_Para.U_CODE)
else:
boundary = Com_Fun.GetHashTable(inputHtHead,b"Content-Type").split(b";")[1].split(b"=")[1]
oldFileName = []
newFileName = []
temFile_dataAry = []
bFlagF = -1
while iAllLength > 0:
bLastCR = False
if Com_Fun.GetHashTableNone(inputHtHead, b"Content-Disposition") != None and len(temFile_dataAry) == 0:
temFile_dataAry = self.GetHttpHeadArray(temInit_msg)
if temInit_msg[len(temInit_msg)-1:len(temInit_msg)] == b'\n':
bLastCR = True
else:
temInit_msg = self.attServSocket.recv(iAllLength)
temFile_dataAry = temInit_msg.split(b'\n')
if temInit_msg[len(temInit_msg)-1:len(temInit_msg)] == b'\n':
bLastCR = True
iIndex = 0
for temItem in temFile_dataAry:
#判断是否正确附件码
if temItem.find(b"--"+boundary) == 0 and temFile is not None:
bSaveFile = True
temFile.close()
temFile = None
bFlagF = -1
#判断是否附件模块
if temItem.find(b"Content-Disposition: form-data") == 0:
cdAry = temItem.split(b";")
if len(cdAry) == 3 and cdAry[2].find(b"filename=") == 1:
bFlagF = 0
else:
bFlagF = -1
if bFlagF == 0 and temItem.find(b"Content-Disposition:") == 0:
oldN = temItem.split(b":")[1].split(b";")[2].split(b"=")[1].replace(b"\r",b"").replace(b"\n",b"").replace(b"\"",b"")
if oldN != b"" and oldN.find(b".") != -1:
if Com_Para.attUpFile.find((oldN.split(b".")[1].lower()+b"|").decode(Com_Para.U_CODE)) == -1:
oldFileName.append("不符合上传文件格式,上传失败:"+oldN.decode(Com_Para.U_CODE))
newFileName.append("不符合上传文件格式,上传失败:"+oldN.decode(Com_Para.U_CODE))
else:
oldFileName.append(oldN.decode(Com_Para.U_CODE))
if oldN.find(b".") == -1:
newFileName.append(Com_Fun.Get_New_GUID().replace("-", "")+".no")
else:
newFileName.append(Com_Fun.Get_New_GUID().replace("-", "")+"."+oldN.decode(Com_Para.U_CODE).split(".")[1])
strF = Com_Para.ApplicationPath+Com_Para.zxyPath+"web"+Com_Para.zxyPath+"file"+Com_Para.zxyPath+newFileName[len(newFileName) - 1]
temFile = open(strF, "wb")
bFlagF = 1
elif bFlagF == 1 and temItem == b"\r":
bFlagF = 2
elif bFlagF == 2 and temFile is not None and iAllLength > 0:
if temItem != b'' and (b"--"+boundary).find(temItem) == 0:
bSaveFile = True
temFile.close()
temFile = None
bFlagF = -1
#break
else:
temFile.write(temItem)
#加上\n间隔符
if iIndex != len(temFile_dataAry) - 1 or bLastCR == True:
temFile.write(b'\n')
iIndex = iIndex + 1
iAllLength = iAllLength - len(temItem+b'\n')
if temFile is not None:
bSaveFile = True
temFile.close()
temFile = None
if bSaveFile == False:
self.attRv.s_result = 0
self.attRv.err_desc = "文件上传失败,请刷新网络或重新上传"
self.attUploadFile = "{\"A01_UpLoadFile\":[{\""+Com_Fun.GetLowUpp("s_result")+"\":\"0\",\""+Com_Fun.GetLowUpp("error_desc")+"\":\"上传失败,请刷新网络或重新上传\"}]}"
return
jso = {}
jsary = []
iIndex = 0
for temItem in oldFileName:
temjso = {}
temjso[Com_Fun.GetLowUpp("oldFileName")] = temItem
temjso[Com_Fun.GetLowUpp("newFileName")] = newFileName[iIndex]
jsary.append(temjso)
iIndex = iIndex + 1
jso["A01_UpLoadFile"] = jsary
self.attUploadFile = json.dumps(jso,ensure_ascii=False)
else:
temStrCheck[1] = ""
temInit_msg = b''
temInit_msg = self.attServSocket.recv(20480)
temStrCheck[1] = urllib.parse.unquote(temInit_msg.decode(Com_Para.U_CODE),Com_Para.U_CODE)
self.attPost_str = temStrCheck[1].split("&")
if temStrCheck[1] != "":
self.attUri += "&" + temStrCheck[1]
except Exception as e:
self.attRv.s_result = 0
self.attRv.err_desc = repr(e)
self.attUploadFile = "{\"A01_UpLoadFile\":[{\""+Com_Fun.GetLowUpp("s_result")+"\":\"0\",\""+Com_Fun.GetLowUpp("error_desc")+"\":\"上传失败,请刷新网络或重新上传\""+ repr(e)+"}]}"
finally:
if temFile is not None:
temFile.close()
temFile = None
Pass
在com.zxy.main.Init_Page.py中添加如下内容
from com.zxy.tcp.ServerThreadHttp import ServerThreadHttp
@staticmethod
def Start_Http():
# 是否启用http协议接口
if Com_Para.bThread == True:
# TCP服务
temSthttp = ServerThreadHttp("", "", Com_Para.port)
t1 = threading.Thread(target=temSthttp.run, name="ServerHttpThread")
t1.start()
web接口服务运行案例MonitorDataCmd.py主文件中编写:
添加如下内容:
#web数据接口服务
Init_Page.Start_Http()
程序运行之后在浏览器敲入如下内容访问数据接口:
http://localhost:9000/CenterData?param_name=A01_AAA111&sub_code=&sub_usercode=
或
http://localhost:9000/CenterData?param_name=A01_AAA222&sub_code=&sub_usercode=
运行结果见图:
后台数据获取调式见:
com.zxy.business.Ope_DB_Cent.py
def Cal_Data(self, inputSub_code, inputParam_name, inputAryParamValue, inputStrIP,inputSession_id,inputHtParam):