zoukankan      html  css  js  c++  java
  • 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)
  • 相关阅读:
    $.data(elem, key, val) 和 elem.data(key, val)
    支付宝调起,应用签名失败,请联系商家
    关于load方法加载时间问题
    你学过的每一样东西,你遭受的每一次苦难,都会在你一生中的某个时候派上用场。 ——佩内洛普·菲兹杰拉德 《离岸》
    iOS视图生命周期总结(别人博客荡来的)
    闲言(诗三百三首)
    iOS 点击WebView中的链接,跳转指定控制器
    IOS 版本号大小比较
    iOS二维码,条形码扫描问题
    IOS使用个推遇到的坑
  • 原文地址:https://www.cnblogs.com/-wenli/p/13453493.html
Copyright © 2011-2022 走看看