• Python Http请求json解析库


    httpparser介绍

    :1.解析字节类型的http与https请求数据

    :2.支持已k-v形式修改请求数据

    :3.支持重新编码请求数据

    源码

    import json
    __author = "-ling"
    
    def parser(request_data):
        # 获取请求的三个段:
        # 1.请求方法 URI协议 版本
        # 2.请求头(Request Header)
        # 3.请求正文
        index0 = request_data.find(b"
    
    ")
        request_predata = request_data[0:index0]
        index1 = request_predata.find(b"
    ")
    
        # 请求方法 URI协议 版本
        request_first_data = request_predata[0:index1].decode("utf-8")
        request_first = {}
        count = 0
        list = ["method", 'url', 'version']
        for line in request_first_data.split(" "):
            if line != "":
                request_first[list[count]] = line
                count += 1
        # print("解析请求方法 URI协议 版本:",request_first)
    
        # 请求头(Request Header)
        request_header_data = request_predata[index1:].decode("utf-8")
        request_headers = {}
        for line in request_header_data.split("
    "):
            if line != "":
                line = line.replace(" ","")
                restemp = line.split(":")
                if restemp[0] == "Host" and len(restemp) == 3:
                    restemp[1] = restemp[1] + ":" +restemp[2]
                request_headers[restemp[0]] = restemp[1]
        # print("请求头(Request Header):",request_headers)
    
        # 请求正文
        request_nextdata = request_data[index0:].decode("utf-8")
        request_content_temp = request_nextdata.replace("
    ", "")
        request_content = None
        if request_content_temp != "":
            request_content = json.loads(request_content_temp)
            # print("请求正文:",request_content)
        else:
            pass
            # print("无请求正文!")
        return request_first,request_headers,request_content,request_nextdata
    
    def update_first_data(request_first_data,field,data):
        request_first_data[field] = data
    
    
    def update_request_headers(request_headers,field,data):
        request_headers[field] = data
    
    
    def update_request_content(request_content,field,data):
        request_content[field] = data
    
    
    def encode(request_first_data,request_headers,request_content):
        request_data = b""
        list = ["method", 'url', 'version']
        for key in list:
            request_data += (request_first_data[key] + " ").encode("utf-8")
        request_data += "
    ".encode("utf-8")
        for key in request_headers.keys():
            request_data += (key + ":" + request_headers[key]).encode("utf-8")
            request_data += "
    ".encode("utf-8")
        request_data += "
    ".encode("utf-8")
        if request_content != None:
                request_data += json.dumps(request_content).encode("utf-8")
        # print("重新编码以后的数据:",request_data.decode("utf-8"))
        return request_data

    如何使用

    1.解析请求数据

    request_first,request_headers,request_content,request_nextdata = httpparser.parser(request_data)

    2.修改或者增加各个部分的字段使用

    update_first_data :修改第一行字段数据
    update_request_headers :修改请求头或者增加请求头字段
    update_request_content :修改请求内容字段或者增加请求内容

    3.再编码三个部分的数据

    encode(request_first_data,request_headers,request_content)
  • 相关阅读:
    [Typescript Challenges] 28. Medium Replace
    [Algorithm] Permutations
    [Typescript] 29. Medium ReplaceAll
    [RxJS] Share data among multiple subscribers with Subjects
    [Typescript] 30. Medium Append Argument
    P3386 【模板】二分图最大匹配
    AcWing 372. 棋盘覆盖
    AcWing 376. 机器任务
    AcWing 379 捉迷藏
    AcWing 378. 骑士放置
  • 原文地址:https://www.cnblogs.com/-wenli/p/13453493.html
Copyright © 2020-2023  润新知