【问题标题】:Python>How to pass CSV Headers & values under headers, as API req parameter/payload, dynamically (without hardcoding headers in code) with request libPython>如何通过请求库动态(在代码中没有硬编码标头)传递标头下的 CSV 标头和值,作为 API req 参数/有效负载
【发布时间】:2022-01-07 20:01:56
【问题描述】:

我正在创建实用程序,它将从数据库中提取 API 定义和相关的请求参数。然后将该信息推送到 CSV(这是要求)。直到这部分我完成了。现在 CSV 我看起来像这样:

(抱歉添加 csv 图像.. 这个编辑器不允许我以默认表格格式添加相同的数据)

现在,我想将这些标头和列中的相应值作为 api 请求参数传递。 如果 API 没有配置值,那么我们可以忽略并传递空正文。

Ex1: 
http://localhost:8080/cm/apis/API6%2Ftoday?username=MyTestUser70
  { "paramsR": {
        "M1": "70878-008",
        "C1": "467345-121",
        "T1":"Hi 2"
    }
}
Ex2:
http://localhost:8080/cm/apis/API3%2Ftoday?username=MyTestUser70
  { }

我正在尝试的看起来像这样:

with open('apis.csv') as csv_file1:
    csv_apis_read = csv.DictReader(csv_file1)
    fields = csv_apis_read.fieldnames
    api_csv = list(csv_apis_read)
    for apis in api_csv: 
        #print(fields)
        #print(apis .get('M1'))
        #apis.get('S1')
        #apis.get('C1')
        final_url = f"{http://localhost:8080}{urllib.parse.quote_plus(apis.get('APIDef'))}"
        #req_json = {"paramsR": {"S1" : apis.get('S1')}}
        req_json = {"paramsR": {"M1" : apis.get('M1')}}
        username = {"username": "MyTestUser70"}
        headers = {'Accept': "application/json",'Content-Type': "application/json",'Accept-Encoding': "gzip, deflate",'Cache-Control': "no-cache",'Token': "null"}
        response = requests.request("POST", f_url, json=req_json, headers=headers, params=uid)
        print(response.request.url)
        print(response.request.body)
        print(response.request.headers)
        print(response.text)
        

Q1.如何动态地将标头值作为有效负载和关联列值作为请求参数传递给所有可用 API(无需在代码中硬编码标头值。)?
注意:标题值不固定。在重新生成第一步标题和相关值更新时提到的 csv 之后。这就是为什么我希望以动态方式生成此密钥对组合,而不是硬编码和预定义任何带有标题和列值的内容。

Q2.在传递请求参数时,有什么方法可以从 M1 和 T1 列值中删除 ['']?

有人可以指导我吗? 提前谢谢你。

【问题讨论】:

    标签: python python-3.x dataframe csv python-requests


    【解决方案1】:

    尝试使用pandas库的iterrows函数,

    import pandas
    
    api_file = pandas.read_csv("apis.csv")
    
    for index, row in api_file.iterrows():
        row = dict(row.dropna())
        
        api_url = row['APIDef'] # Add the prefix
        row.pop('APIDef')
        
        for key in row.keys():
            if key == "M1":
                row[key] = eval(row[key])[0]
            if key == "C1":
                row[key] = int(row[key])
            if key == "T1":
                row[key] = eval(row[key])[0]
            if key == "S1":
                if row[key]:
                    row[key] = True
                else:
                    row[key] = False
        
        req_json = {}
        
        if row:
            req_json["paramsR"] = row
        
        print(api_url, req_json)
    
        
        # Make your requests
    

    打印出端点和参数的输出。

    编码愉快!

    【讨论】:

    猜你喜欢
    • 2019-04-03
    • 1970-01-01
    • 1970-01-01
    • 2022-11-27
    • 1970-01-01
    • 1970-01-01
    • 2021-07-10
    • 1970-01-01
    • 2018-12-09
    相关资源
    最近更新 更多