Python 报错:json.decoder.JSONDecodeError:Expecting value: line 1 column 1 (char 0)

修改前的代码

报错

1. 项目结构:参见图片左侧的“FOLDERS”下方;

1.1 主函数入口文件为《run_test.py》
修改前的《run_test.py》文件

主要的问题就在于没有将从《get_data.py》文件调用get_data_for_json函数取得的返回值data转换成json格式,所以我在后面ctrl+B调试的时候,会返回一个400,也就是请求体格式不正确,多方查资料才知道是python获取到的返回值data是一个字典,而非json,然而我的接口传参的方式是application/json格式,所以这里添加了一条转化格式的语句:data_json = json.dumps(data),同时将后面的(method,url,data,header)改成了(method,url,data_json,header) 以对应。修改后的代码如下:

#coding:utf-8
#主流程封装文件《run_test.py》
import json
import sys
sys.path.append("D:\\djangostudy\\pdrcInterface")  #将项目所在路径添加到系统路径中
import data_config     #引入《data_config》文件中的 global_var类,用于获取excel用例文件的各个字段在sheet表中的位置
from base.runmethod import RunMethod  #引入base文件夹下《runmethod.py》文件的 RunMethod类,用于获取 Post和 get方法
from data.get_data import GetData  #引入base文件夹下《get_data.py》文件的GetData类,获取各具体字段值


class RunTest:  
    def __init__(self):
        self.run_method = RunMethod()   #实例化,以便后面代码调用RunMethod()类中的所有方法
        self.data = GetData()     #实例化,以便后面代码调用GetData()类中的所有方法

    #程序执行的主入口
    def go_on_run(self):
        res = None
        #10
        rows_count = self.data.get_case_lines()  #调用《get_data.py》文件下的get_case_lines函数
        for i in range(1,rows_count):
            #name = self.data.get_request_name(i)
            url = self.data.get_request_url(i)    #调用《get_data.py》文件下的get_request_url函数
            method = self.data.get_request_method(i)   #调用《get_data.py》文件下的get_request_method函数
            is_run = self.data.get_is_run(i)    #调用《get_data.py》文件下的get_is_run函数
            # 获取请求参数
            data = self.data.get_data_for_json(i)   #调用《get_data.py》文件下的get_data_for_json函数
            data_json = json.dumps(data)   #将获取到的函数返回值data转换成json格式
            header = self.data.is_header(i)   #调用《get_data.py》文件下的is_header函数

            if is_run:
                #执行顺序不能错,必须是跟runmethod一致:method,url,data=None,header=None               
                #print("request_name:",interface_name)
                print("URL:",url)
                print("Method:",method)
                print("Params:",data_json,'\n')
                res = self.run_method.run_main(method,url,data_json,header) #调用《runmethod.py》文件下的run_main函数
                res_json = json.dumps(res,ensure_ascii=False,indent=2)              
                print("Response:",res_json)
                print("*"*100+"分割线"+"*"*100,'\n')
        

if __name__ == '__main__':
    run = RunTest()
    Result = run.go_on_run()
    print(Result,'\n')

调用结果:


调用成功
与excel比对
1.2 调用的文件1:《runmethod.py》

代码如下:

#coding:utf-8
#被调用文件《runmethod.py》,该文件的作用是封装 post、get基类

import requests

class RunMethod:
    def post_main(self,url,data,header=None):
        res = None
        if header != "None":            
            res = requests.post(url=url,data=data,headers=header).json()
        else:
            res = requests.post(url=url,data=data).json()
        return res



    def get_main(self,url,data=None,header=None):
        res = None
        if header != "None":
            res = requests.get(url=url,data=data,headers=header).json()
        else:
            res = requests.get(url=url,data=data).json()
        return res



    def run_main(self,method,url,data=None,header=None):
        res = None
        if method == 'POST':
            res = self.post_main(url,data,header)
        else:
            res = self.get_main(url,data,header)
        return res
1.3 调用的文件2:《get_data.py》

这里有一个header值,一开始调用的是return data_config.get_header_value(),也就是去调用《data_config.py》文件下的get_header_value函数,去动态获取header的值,但是不知道为什么没有调用成功,主函数运行的时候,结果返回的是None,目前还没有弄明白,后续再研究。后来指定了一个 header值,暂时跑通了。
代码如下:

#coding:utf-8
import sys
sys.path.append("D:\\djangostudy\\pdrcInterface")
import data_config
from util.operation_excel import OperationExcel  #引入util文件加下《operation_excel.py》文件下的 OperationExcel 类
from util.operation_json import OperationJson  #引入util文件加下《operation_json.py》文件下的 OperationJson 类

class GetData:
    """docstring for GetData"""
    def __init__(self):
        self.opera_excel = OperationExcel()  #实例化,以便后面代码调用 OperationExcel()类中的所有方法

    #去获取excel的行数,就是我们的case数
    def get_case_lines(self):
        return self.opera_excel.get_lines()  #调用《operation_excel.py》文件下的get_lines()函数

    #获取是否执行
    def get_is_run(self,row):
        flag = None
        col = int(data_config.get_run())  #通过《data_config.py》文件下的get_run方法获取get_run字段在sheet表中的位置值
        run_model = self.opera_excel.get_cell_value(row,col)  #调用《operation_excel.py》文件下的 get_cell_value()函数
        if run_model == 'yes':
            flag = True
        else:
            flag = False
        return flag

    # 判断是否携带header
    def is_header(self,row):
        col = int(data_config.get_header())
        header = self.opera_excel.get_cell_value(row,col)  #调用《operation_excel.py》文件下的 get_cell_value()函数
        #给定header的值 
        header_value = {"Content-Type":"application/json"}  # 这里指定了 header 的值
        if header == 'yes':
            #return data_config.get_header_value()
            return header_value
        else:
            return None

    #获取请求方式
    def get_request_method(self,row):
        col = int(data_config.get_runway())
        request_method = self.opera_excel.get_cell_value(row,col)  #调用《operation_excel.py》文件下的 get_cell_value()函数
        return request_method

    # 获取url
    def get_request_url(self,row):
        col = int(data_config.get_url())    
        url = self.opera_excel.get_cell_value(row,col)  #调用《operation_excel.py》文件下的 get_cell_value()函数
        return url

    #获取请求数据
    def get_request_data(self,row):
        col = int(data_config.get_data())
        data = self.opera_excel.get_cell_value(row,col)  #调用《operation_excel.py》文件下的 get_cell_value()函数
        if data == '':
            return None
        return data

    # 通过获取关键字拿到data数据
    def get_data_for_json(self,row):
        opera_json = OperationJson()
        request_data = opera_json.get_data(self.get_request_data(row))  #调用《operation_json.py》文件下的 get_data()函数
        return request_data

    # 获取预期结果
    def get_expect_data(self,row):
        col = int(data.get_expect())
        edxpect = self.opera_excel.get_cell_value(row,col)  #调用《operation_excel.py》文件下的 get_cell_value()函数
        if expect == '':
            return None
        return expect
1.4 调用的文件3:《data_config.py》
#coding:utf-8


class global_var:
    """case_id"""
    Id = '0'
    request_name = '1'
    url = '2'
    run = '3'
    request_way = '4'
    header = '5'
    case_depend = '6'
    data_depend = '7'
    field_depend = '8'
    data = '9'
    expect = '10'
    result = '11'

# 获取 caseid
def get_id():
    return global_var.Id

def get_request_name():
    return global_var.request_name

#获取url
def get_url():
    return global_var.url

#是否运行
def get_run():
    return global_var.run

#获取运行方式
def get_runway():
    return global_var.request_way

def get_header():
    return global_var.header

def get_case_depend():
    return global_var.case_depend

def get_data_depend():
    return global_var.data_depend

def get_field_depend():
    return global_var.field_depend

def get_data():
    return global_var.data

def get_expect():
    return global_var.expect

def get_result():
    return global_var.result

#获取header
def get_header_value():
    header_value = {"Content-Type":"application/json"}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,002评论 6 509
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,777评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,341评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,085评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,110评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,868评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,528评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,422评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,938评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,067评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,199评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,877评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,540评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,079评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,192评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,514评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,190评论 2 357

推荐阅读更多精彩内容

  • 概要 64学时 3.5学分 章节安排 电子商务网站概况 HTML5+CSS3 JavaScript Node 电子...
    阿啊阿吖丁阅读 9,216评论 0 3
  • pyspark.sql模块 模块上下文 Spark SQL和DataFrames的重要类: pyspark.sql...
    mpro阅读 9,458评论 0 13
  • width: 65%;border: 1px solid #ddd;outline: 1300px solid #...
    邵胜奥阅读 4,826评论 0 1
  • 写在前面的话 代码中的# > 表示的是输出结果 输入 使用input()函数 用法 注意input函数输出的均是字...
    FlyingLittlePG阅读 2,764评论 0 8
  • 树姿 即使掉光了叶子,也不失傲然风采。依然以笔直的身姿,随时迎候寒风的造访,雨雪的光临,以及鸟雀的问候~ 2020...
    自雨自在阅读 233评论 1 1