Python 3.x Xml 데이터 기반 Http 요청 방법

6694 단어 PythonXmlHttp
1.머리말
회사 의 한 프로젝트 는 B/S 구 조 를 바탕 으로 WEB 서비스 와 통신 하기 때문에 XML 데 이 터 를 통신 데이터 로 사용 합 니 다.새로운 기능 을 추가 할 때 WEB 엔 드 와 클 라 이언 트 는 각각 다른 부서 에서 책임 을 지기 때문에 WEB 엔 드 기능 이 실현 되 는 과정 에서 스스로 테스트 를 요청 해 야 하기 때문에 Python 을 사용 하여 이 스 크 립 트 를 작 성 했 습 니 다.또한 이 스 크 립 트 는 처음에는 압력 테스트 기능 으로 발전 하 기 를 원 했 기 때문에 기본 적 인 방문 을 제외 하고 다 중 스 레 드 요청 을 추가 하 였 습 니 다.
전체 스 크 립 트 에 관련 된 Python 에 대한 지식 은 다음 과 같 습 니 다.
urllib.request 기반 Http 접근
다 중 스 레 드
클래스 와 방법의 정의
전역 변수의 정의 와 사용
파일 읽 기와 쓰기
……
2.소스 코드 와 결과
전체 프로그램 은 Python 소스 코드 와 프로필 을 포함 합 니 다.소스 코드 에 해당 하 는 주석 이 있 기 때문에 소스 코드 를 직접 붙 입 니 다.다음 과 같 습 니 다.

# TradeWeb    
import threading, time, http.client, urllib.request, os
#import matplotlib.pyplot as plt

URL = 'http://127.0.0.1:8888/XXXXXXXXX/httpXmlServlet' #         ,     

TOTAL = 0; #   
SUCC = 0; #       
FAIL = 0; #       
EXCEPT = 0 #       
MAXTIME = 0 #        
MINTIME = 100 #       ,    100 
COUNT_TIME = 0 #    
THREAD_COUNT = 0 #       
CODE_MAP = {200:0, 301:0, 302:0, 304:0} #      (  )
RESULT_FILE = 'tradeWebResult.xml'  #       
REQUEST_DATA_FILE = 'requestData.config'  #     

DATA = '''  tradeWebRequestData.config     '''

TIME_LIST = [] #       

#    threading.Thread    
class RequestThread(threading.Thread):
 #    
 def __init__(self, thread_name):
 threading.Thread.__init__(self)
 self.test_count = 0;

 #         
 def run(self):
 global THREAD_COUNT
 THREAD_COUNT += 1
 #print("Start the count of thread:%d" %(THREAD_COUNT))
 self.testPerformace()

 #      
 def testPerformace(self):
 global TOTAL 
 global SUCC 
 global FAIL 
 global EXCEPT 
 global DATA
 global COUNT_TIME
 global CODE_MAP
 global URL
 try:
  st = time.time() #      

  start_time
  cookies = urllib.request.HTTPCookieProcessor()
  opener = urllib.request.build_opener(cookies)

  resp = urllib.request.Request(url=URL,
     headers={'Content-Type':'text/xml', 'Connection':'Keep-Alive'},
     data=DATA.encode('gbk'))

  respResult = opener.open(resp)

  #       START
  code = respResult.getcode()
  if code == 200:
  SUCC += 1
  else:
  FAIL += 1

  if code in CODE_MAP.keys():
  CODE_MAP[code] += 1
  else:
  CODE_MAP[code] = 1

  # print(request.status)
  #       END  

  html = respResult.read().decode('gbk')
  print(html)

  time_span = time.time() - st #       

  #       
  TIME_LIST.append(round(time_span * 1000))

  # print('%-13s: %f ' %(self.name, time_span))

  self.maxtime(time_span)
  self.mintime(time_span)

  self.writeToFile(html)

  # info = respResult.info() #      
  # url = respResult.geturl() # URL  
  # print(info);
  # print(url)

  COUNT_TIME += time_span
  TOTAL += 1
 except Exception as e:
  print(e)
  TOTAL += 1
  EXCEPT += 1

 #       ,               
 def maxtime(self, ts):
 global MAXTIME
 #print("time:%f" %(ts))
 if ts > MAXTIME:
  MAXTIME = ts

 #       ,               
 def mintime(self, ts):
 global MINTIME
 #print("time:%f" %(ts))
 if ts < MINTIME and ts > 0.000000000000000001:
  MINTIME = ts

 #     
 def writeToFile(self, html):
 f = open(RESULT_FILE, 'w')
 f.write(html)
 f.write('\r
') f.close(); # XML def loadData(): global URL global DATA f = open(REQUEST_DATA_FILE, 'r') URL = "".join(f.readline()) DATA = "".join(f.readlines()) # print(DATA) f.close() if __name__ == "__main__": # print("============ ============") print("") # start_time = time.time() # thread_count = 1 loadData() # i = 0 while i < thread_count: t = RequestThread("Thread" + str(i)) t.start() i += 1 t = 0 while TOTAL < thread_count and t < 60: # print("total:%d, succ:%d, fail:%d, except:%d
" %(TOTAL,SUCC,FAIL,EXCEPT)) print(" ",URL) t += 1 time.sleep(1) # print() print(" ", URL, " :") print(" = %d, = %d, = %d, = %d" %(TOTAL, SUCC, FAIL, EXCEPT)) print() print(" ( ):") print(" =", int(COUNT_TIME * 1000), "ms", end = '') print(" =", round(MAXTIME * 1000), "ms", end = '') print(" =", round(MINTIME * 1000), "ms", end = '') print(" =", round((COUNT_TIME / thread_count) * 1000), "ms") print() print(" ( : ):") print(" ", CODE_MAP) print() print(" ", RESULT_FILE, " ( XML )") print() # os.system("pause") print(TIME_LIST) input()
설정 파일 은 주로 접근 경 로 를 쉽게 변경 하 는 데 있 습 니 다.그 중에서 SESSIONID 는 Fiddler 에서 패키지 로 가 져 옵 니 다.프로필 원본 파일 은 다음 과 같 습 니 다.(회사 의 프라이버시 를 누설 하지 않 기 위해 데 이 터 는 원본 데이터 가 아니 지만 형식 은 같 습 니 다)

http://127.0.0.1:8888/XXXXXXXXX/httpXmlServlet

<?xml version=“1.0” encoding = “GB2312”?>
<COM>
<REQ name="commodity_query">
<USER_ID>0001</USER_ID>
<COMMODITY_ID>0000</COMMODITY_ID>
<SESSION_ID>4918081208706966071</SESSION_ID>
</REQ>
</COM>
테스트 결 과 는 다음 과 같다.
Python 3.x基于Xml数据的Http请求方法
회사 의 보안 요구 로 주소 가 모호 하 게 처리 되 었 고,별도로 출력 된 tradeWebResult.xml 결과 페이지 도 표시 되 지 않 았 습 니 다.
이상 은 개인 적 으로 Python 과정 을 학습 하고 사용 하 는 기록 일 뿐 프로그램 설계 나 부적 절 한 사용 을 피 할 수 없습니다.더 좋 은 의견 이 있 으 면 지적 을 환영 합 니 다.
주:이 코드 개발 환경 은 Python 3.5+windows 로 Python 2.x 환경 에서 테스트 되 지 않 았 습 니 다.
이상 의 Python 3.x Xml 데 이 터 를 기반 으로 한 Http 요청 방법 은 바로 여러분 에 게 공 유 된 모든 내용 입 니 다.여러분 에 게 참고 가 되 었 으 면 좋 겠 습 니 다.여러분 의 많은 응원 바 랍 니 다.

좋은 웹페이지 즐겨찾기